要注意的就是strlen(s1)需要提前算出来,因为个人习惯喜欢在循环中使用。。
因为这个点超时一个下午没发现
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
int a[50001];
int n,k;
int y;
int main(){
char s1[100001];
char str[200000+50];
gets(s1);
int len=0;
int num=strlen(s1);
for(int i=0;i<num;i++){
str[len++]='#';
str[len++]=s1[i];
}
str[len++]='#';
int le[200000+50]={0};
int you=0,sum=0,id=0;
for(int i=1;i<len;i++){
if(you>i) le[i]=min(le[2*id-i],you-i);
else le[i]=1;
while(i-le[i]>=0&&i+le[i]<len&&str[i-le[i]]==str[i+le[i]])
le[i]++;
if(le[i]+i>you){
you=le[i]+i;
id=i;
}
sum=max(sum,le[i]);
}
cout<<--sum;
return 0;
}