标签:
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
1.直接暴力枚举
#include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> #include<cstring> #include<vector> using namespace std; const int maxn=1000005; typedef long long LL; char s[maxn]; int main(){ int T; //freopen("Text//in.txt","r",stdin); while(~scanf("%s",s)&&s[0]!='.'){ int len=strlen(s); for(int i=1;i<=len;i++)if(len%i==0){ int ok=1; for(int j=i;j<len;j++){ if(s[j]!=s[j%i]){ ok=0;break; } } if(ok){ printf("%d\n",len/i);break; } } } return 0; }
2.kmp算法 i-next[i]:表示已i结尾的前缀的循环节的长度
#include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> #include<cstring> #include<vector> using namespace std; const int maxn=1000005; typedef long long LL; char s[maxn]; int next[maxn]; void getnext(char*s){ int len=strlen(s); int i=0,j=-1; next[0]=-1; while(i<len){ if(j==-1||s[i]==s[j]){ next[++i]=++j; } else j=next[j]; } } int main(){ int T; //freopen("Text//in.txt","r",stdin); while(~scanf("%s",s)&&s[0]!='.'){ int len=strlen(s); getnext(s); int k=len-next[len]; if(len%k==0){ printf("%d\n",len/k); } else printf("1\n"); } return 0; }
G - Power Strings POJ 2406 (字符串的周期)
标签:
原文地址:http://blog.csdn.net/u013167299/article/details/46050405