4:字符串乘方
-
总时间限制:
- 3000ms 内存限制:
- 65536kB
-
描述
-
给定两个字符串a和b,我们定义a*b为他们的连接。例如,如果a=”abc” 而b=”def”, 则a*b=”abcdef”。 如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a^0=””(空字符串),a^(n+1)=a*(a^n)。
输入
- 每一个测试样例是一行可打印的字符作为输入,用s表示。s的长度至少为1,且不会超过一百万。最后的测试样例后面将是一个点号作为一行。 输出
- 对于每一个s,你应该打印最大的n,使得存在一个a,让s=a^n 样例输入
-
abcd aaaa ababab .
样例输出
-
1 4 3
提示
- 本问题输入量很大,请用scanf代替cin,从而避免超时。 来源
- Waterloo local 2002.07.01
-
-
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; char s[1000005]; int Next[1000005]; int main() { while(true) { gets(s); int len=strlen(s); if(s[0]=='.'&&len==1)break; Next[0]=-1; Next[1]=0; for(int i=2;i<=len;++i) { int t=Next[i-1]; while(t>=0&&s[i-1]!=s[t]) { t=Next[t]; } t++; Next[i]=t; } if(len%(len-Next[len])==0) { cout<<len/(len-Next[len])<<endl; } else { cout<<1<<endl; } } return 0; }