大家好~ 我是一个题解。。。。
我是主人的处女作。。。求不喷。。。
http://poj.org/problem?id=2406 题目链接在此。。
题意:字符串相乘等于字符串连接。。。。给你一个串s,求出最大的使某个字符串a满足 a^n=s....
所以。。kmp生成s的next数组后,从数组后面寻找重复的周期。。。。即用长度减去最后一位的匹配数,得到可能的周期,考察可能的周期与总长度的关系,如果能整除,则证明周期的合法性,输出。。。否则无周期,即s就是a,那么n就是1.。。
代码如下:
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1100000;
int next[maxn];
char word[maxn];
int len;
void get_next()
{
int i=-1,j=0;
next[0]=-1;
while(j<len)
{
if(i==-1||word[i]==word[j])
{
i++;
j++;
next[j]=i;
}
else i=next[i];
}
}
int main()
{
while(1)
{
scanf("%s",word);
if(strcmp(word,".")==0)
break;
// printf("%s",word);
len=strlen(word);
get_next();
//printf("1\n");
int i;
// for(i=0;i<len;i++)
// {
// printf("%d ",next[i]);
// printf("\n");
// }
if(len%(len-next[len]))
printf("1\n");
else printf("%d\n",len/(len-next[len]));
}
return 0;
}
手残不会调试。。。只能用万能的输出语句。。。。