用来算回文串的回文半径
原理看这里:
原理
下面直接上模板
#include<iostream>
#include<cstdio>
using namespace std;
const int N = 11000002;
char s[N << 1];
int r[N << 1],cnt;
void read(){//预处理字符串,将字符串长度处理成2n + 1
char c = getchar();
cnt = 1;
s[0] = '~';s[1] = '|';
while(c < 'a' || c > 'z') c= getchar();
while(c >= 'a' && c <= 'z') s[++ cnt] = c,s[++ cnt] = '|',c = getchar();
}
int main(){
read();
int rb = 0,mid = 0;
for(int i = 1;i <= cnt;i++){//计算回文半径r[],答案是r[](max) - 1
if(i <= rb) r[i] = min(r[(mid << 1) - i],rb - i + 1);
while(s[i - r[i]] == s[i + r[i]]) r[i] ++;
if(r[i] + i > rb) rb = r[i] + i - 1,mid = i;
}
return 0;
}