UVA 455
最近好像很喜欢用set容器,觉得字符串的判是否重复这样的题目,用这个很棒,455这道题就是找循环节。我的思路是如果 s[i]==s[0]&&len%i==0
这个条件说明i可能是循环节。然后对于以后的字符串就截取i个,所以就会把字符串s截成len/i段。加入到set容器里,会出现3种情况:
1) size()==1 ,这说明在截取字符串的时候一直没有字符串往里加,就是set里面的元素就是循环节,输出它的长度即可
2) size()!=1,这说明有不同于循环节的字符往里面加了。所以这是应该break程序。
3)size()==0 ,这说明没有循环节往里加,说明字符串是不循环的,输出字符串的长度即可。
#include <iostream> #include<stdio.h> #include<stdlib.h> #include<string> #include<string.h> #include<set> using namespace std; int main() { int n; scanf("%d",&n); set<string> se; string s,f; while(n--){ se.clear(); cin>>s; int len=s.length(); for(int i=1;i<len;i++){ se.clear(); if(s[i]==s[0]&&len%i==0){ se.insert(s.substr(0,i)); for(int j=i;j<len;j+=i){ f=s.substr(j,i); if(!se.count(f)){ se.insert(f); break; } } } if(se.size()==1){ set<string>::iterator it=se.begin(); f=*it; cout<<f.length()<<endl; break; } } if(se.size()==0){ cout<<len<<endl; } if(n) cout<<endl; } return 0; }