首先想到一种很快速的方法求回文子串,就是枚举一下子串的中间位置,然后向两边扩展比较!但是这时候会出现一个问题那就是当这个串本身是一个重复串只有一个字符的时候那这个算法就是一个n^2的算法,但是这个算法本身对于其他数据是很有价值的,所以只需要对这种重复的串的问题可以单独进行一下处理就可以很快的完成求解
#include <cstdio>
#include <iostream>
using namespace std;
char a[1000010];
int fun(){
int ans = 0;
for(int i = 1;a[i];i++){
int t;
int s = i,e = i;
while(a[e+1] == a[s]) e++;//这里就是对重复串的计算,每次当遇到重复串的时候就可以将i直接跳转到最后那么位置,因为这一段是重复的,所以就回文
串的中心位置只会出现在这个子串的中间位置
i = e;
while(a[s-1] == a[e+1]) s--,e++;两边扩展
t = e -s +1;
if(t > ans) ans = t;
}
printf("%d\n",ans);
}
int main(){
a[0] = '@';
int n;
cin >> n;
for(int i = 0;i < n;i++){
scanf("%s",a+1);
fun();
}
return 0;
}