Power Strings
Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 27694 | Accepted: 11600 |
Description
Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative integer is defined in the normal way: a^0 = "" (the empty string) and a^(n+1) = a*(a^n).
Input
Each test case is a line of input representing s, a string of printable characters. The length of s will be at least 1 and will not exceed 1 million characters. A line containing a period follows the last test case.
Output
For each s you should print the largest n such that s = a^n for some string a.
Sample Input
abcd aaaa ababab .
Sample Output
1 4 3
Hint
This problem has huge input, use scanf instead of cin to avoid time limit exceed.
Source
如果len%(len-next[len-1])==0,则 字符串中必存在最小循环节,且循环次数 即为 len/(len-next[len-1])
证明:
必要性:因为字符串中存在最小循环节 (设长度为k),next[len-1]=len-k,所以len%(lennext[len-1])==0;
充分性:令k1=len-next[len-1],由于k1整除len, 所以可以相应的把len划分为n片区域 (n=len/(k1)),从小到大依次表示为 • t1,t2...tn;由next数组的定义可知, t1=t2,t2=t3,...t(n-1)=tn,且相应的片区域即为最 小,所以循环次数也为len/(len-next[len-1]);
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int nMax=1000005;
const int mMax=1000005;
char text[mMax],pat[nMax];
int lent,lenp,next[nMax];
void get_next()
{
int i,j=0;
next[0]=-1;
for(i=1; i<lenp; i++)
{
j=next[i-1];
while(j&&pat[j]!=pat[i])
j=next[j-1];
if(pat[j]==pat[i])
{
next[i]=j+1;
}
else next[i]=0;
}
}
//int KMP()
//{
// int ans=0,i=0,j=-1;
// get_next();
// for(i=0; i<lent; i++)
// {
// while(j!=-1&&pat[j+1]!=text[i])
// {
// j=next[j];
// }
// if(pat[j+1]==text[i])j=j+1;
// if(j==lenp-1)ans++; //找到一个匹配
// }
// return ans;
//}
int main()
{
int t;
// scanf("%d",&t);
while(scanf("%s",pat)&&pat[0]!='.')
{
lenp=strlen(pat);
// lent=strlen(text);
// printf("%d\n",KMP());
get_next();
//for(int i=1;i<5;i++)
// cout<<next[i]<< " ";
if(lenp%(lenp-next[lenp-1])==0)
{
printf("%d\n",lenp/(lenp-next[lenp-1]));
}
else
printf("1\n");
}
return 0;
}