嘿嘿,以前写的,刚刚突然看到的,就贴一下咯,KMP 的求next[]数组的活用,求最长重复字串
pku2406
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char str [1000010];
int next[1000010];
int getnext()
{
int i= 0, j= -1; next[0]= -1;
while( str[i] )//这个过程其实就是在求next[]数组
{
if( j== -1 || str[i]== str[j] )
{
++i,++j;
next[i]= j;
}
else j= next[j];
}
int len= strlen(str);
i= len- j;
if( len% i== 0 ) return len/ i;
else return 1;
}
int main()
{
while( gets( str), str[0]!= '.' )
printf("%d\n", getnext() );
return 0;
}
pku 1961
#include<iostream>
#include<string.h>
using namespace std;
char str[1000010];
int net[1000010],len;
void get_next()
{
net[0]=-1;
int i=0,j=-1;
while(str[i])
{
if(j==-1 || str[i]==str[j])
{
i++;j++;
net[i]=j;
}
else j=net[j];
}
}
int main()
{
int cas=0;
while(scanf("%d",&len)==1 && len)
{
scanf("%s",str);
printf("Test case #%d\n",++cas);
get_next();
for(int i=2;i<=len;i++)
{
int k=i-net[i];
if(i%k==0 && i/k >=2)
printf("%d %d\n",i,i/k);
}
puts("");
}
return 0;
}
hdu 3746 Cyclic Nacklace
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include<iostream> #include<algorithm> using namespace std; const int N = 100000+10; char p[N]; int nxt[N],m; void get_next() { nxt[0]=-1; int k=-1; for(int i=1;i<=m-1;i++) { while(k>-1 && p[k+1] !=p[i]) k=nxt[k]; if(p[k+1]==p[i]) ++k; nxt[i]=k; } } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",p); m=strlen(p); get_next(); int len=m-nxt[m-1]-1; if(len!=m && m%len==0) printf("0\n"); else printf("%d\n",len-m%len); } return 0; }