题目传送(http://poj.org/problem?id=2406):
题目描述
例如:s1="xy",s2="z",那么s1*s2="xyz"。
由此可以定义s1的幂次:s1^0="",s1^n=s1*s1^(n-1),n>0。
输入
每组数据由一行构成,包含一个字符串s。
输入数据以"."结束。
输出
样例输入
aaad aaaa ababab .
样例输出
1 4 3
数据范围1≤s的长度≤1,000,000Hint
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1000005;
char s[maxn];
int next[maxn];
int main() {
while(~scanf("%s", s)&&s[0]!='.'){
next[0] = -1;//初始化
int len = strlen(s);//测长;
int i = 0, j = -1;//初始化;
while(i < len){//保证判断完最后一个字符跳出;
//这里本人当时看了很久才看懂,其实只要带几个测试数据跟着代码走一遍就懂了;
/*
大概就是:i,j都是第几个字符,输入的第一个是s[0],所以i初始化为0,
这里的比较是后面的与前面的比较,所以j初始化为-1;
这里比较是先用next[i]=j来记录第i个字符与第j个相等;
然后判断第i个字符与前面第j个字符比较是否相等,若不相等,j复位为-1;
若相等,接着判断i+1与j+1是否相等......
由于第一个字符的角标为0所以这里是先用 next[i]=j来记录第i个字符与第j个相等,
这样的话判断完最后next[len]就是第一个字符到倒数第二个周期的最后一个字符的长度,
用总长度减去next[len]就是剩下的最后一个周期也就是该字符串的最大周期;
最后用总长度除以最大周期就是结果;
*/
if(j == -1 || s[i] == s[j]) next[++ i] = ++ j;
else j = next[j];
}
if(len % (len - next[len]) == 0) printf("%d
", len / (len - next[len]));
else printf("1
");
}
return 0;
}