1.KMP算法next数组(最长公共前后缀)
int Next[maxn];
char s[maxn],t[maxn];
void restart()
{
int i=-1,j=0;
int len=strlen(s);
Next[0]=-1;
/***
abababd
abababd
***/
while(j<len)
{
if(i==-1||s[i]==s[j])
{
i++;
j++;
Next[j]=i;
}
else
i=Next[i];
}
/* for(int i=0;i<len;i++)
printf("%d ",Next[i]);*/
}
1(补).补上kmp:
/***
abadac
abab
当next[]为0时,说明没有相同的前后缀,也就是当前无法起作用,只能乖乖向后移.
abadac
abadac
***/
int i=0;
int j=0;
int len1=strlen(s),len2=strlen(p);
while(i<len1)
{
if(j==-1||s[i]==p[j])
{
i++;
j++;
}
else
j=nex[j];
if(j==len2)
{
sum++;
j=-1;
i--;
}
}
2.Mannacher算法求最长回文字符串
int AC()
{
cop[0]='&';
int len=0;
cop[++len]='#';
for(int i=0;s[i];i++)
{
cop[++len]=s[i];
cop[++len]='#';
}
cop[len+1]='\0';
int id=1,mx=0,maxl=0;
for(int i=1;i<=len;i++)
{
p[i]=mx>i?min(p[2*id-i],mx-i):1;
while(cop[i-p[i]]==cop[i+p[i]]) ++p[i];
if(mx<i+p[i])
{
mx=i+p[i];
id=i;
}
maxl=max(maxl,p[i]-1);
}
return maxl;
}