H - Power Strings POJ - 2406

题目传送(http://poj.org/problem?id=2406):

 

题目描述

定义两个字符串s1和s2的乘积s1*s2为将s1和s2连结起来得到的字符串。 
例如:s1="xy",s2="z",那么s1*s2="xyz"。 
由此可以定义s1的幂次:s1^0="",s1^n=s1*s1^(n-1),n>0。

输入

输入包含多组测试数据。 
每组数据由一行构成,包含一个字符串s。 
输入数据以"."结束。

输出

对于每组输入数据输出一行,找出最大的正整数n,使得存在某个字符串a,s = a^n.

样例输入

aaad
aaaa
ababab
.

样例输出

1
4
3

数据范围1≤s的长度≤1,000,000Hint

不要使用cin读取数据
 
 
代码如下(改代码来源于网络):
 
 

#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\n", len / (len - next[len]));
else printf("1\n");
}
return 0;
}

posted @ 2017-04-10 00:48  雪晨  阅读(208)  评论(0编辑  收藏  举报