2016暑期集训7-A
POJ 2406 Power Strings
kmp变形,next数组的应用
题意
给一字符串,寻找最小的循环节最多循环多少次才能构成这个字符串。输出次数。
比如‘aaaa’由4个‘a’构成,循环节出现4次;‘abababababab’最短循环节‘ab’出现6次。
思路
kmp中的next数组作用就是找循环节,把题给字符串当成匹配字符串,kmp[n]表示前面多少个字符平移后与后面的相同,搞一搞就是循环节长度,就是k/(k-ne_xt[k-1])。
代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
#include <vector>
using namespace std;
const int MAXN=1000007;
const int oo=999999999;
const long long int loo=10000000000000000ll;
char P[MAXN];
int ne_xt[MAXN];
void getNext()//kmp求next
{
int q,k;
int m=strlen(P);
ne_xt[0]=0;
for(q=1,k=0; q < m; ++q)
{
while(k > 0 && P[q] != P[k])
k=ne_xt[k-1];
if(P[q] == P[k])
{
k++;
}
ne_xt[q]=k;
}
}
int main()
{
memset(P,0,sizeof(P));
while(~scanf("%s",P))
{
if(strcmp(P,".")==0)
{
return 0;
}
memset(ne_xt,0,sizeof(ne_xt));
int k=strlen(P);
getNext();
if((k%(k-ne_xt[k-1]))==0)
{
printf("%d\n",k/(k-ne_xt[k-1]));
}
else
{
printf("1\n");
}
memset(P,0,sizeof(P));
}
}