拓展KMP
拓展KMP
void pre_EKMP(char x[], int m)
{
Next[0] = m;
int j = 0;
while(j+1<m && x[j] == x[j+1] ) j++;
Next[1] = j;
int k = 1;
for(int i=2; i<m; i++){
int p = Next[k] + k - 1;
int L = Next[i-k];
if(i+L < p+1) Next[i] = L;
else{
j = max(0, p-i+1);
while(j+i < m && x[i+j]==x[j]) j++;
Next[i] = j;
k = i;
}
}
}
void EKMP(char x[], int m, char y[], int n)
{
pre_EKMP(x, m);
int j = 0;
while(j<n && j<m && x[j]==y[j]) j++;
ext[0] = j;
int k = 0;
for(int i=1;i<n;i++)
{
int p = ext[k]+k-1;
int L = Next[i-k];
if(i+L < p+1) ext[i] = L;
else{
j = max(0, p-i+1);
while(i+j<n && j<m && y[i+j]==x[j]) j++;
ext[i] = j;
k = i;
}
}
}
Manachar
Manachar
char s[maxn];
char str[maxn];
int len;
int p[maxn];
void getstr()
{
int k = 0;
str[k++] = '@';
len = (int)strlen(s);
for(int i=0;i<len;i++)
{
str[k++] = '#';
str[k++] = s[i];
}
str[k++] = '#';
len = k;
str[k] = 0;
}
void manncher()
{
int mx = 0, id = 0;
int maxx = 0;
for(int i=0;i<len;i++)
{
if(mx>i) p[i] = min(mx-i, p[2*id-i]);
else p[i] = 1;
while(str[i+p[i]]==str[i-p[i]]) p[i]++;
if(p[i]+i>mx)
{
mx = p[i] + i;
id = i;
}
}
}
p[i]-1
即为以此处为中心的最大回文串长度
- 回文串开始的下标是
(i-p[i])/2