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;
}
原文地址:https://www.cnblogs.com/wintersong/p/5067156.html