回文串:o(n)
#include<iostream> #include<string> using namespace std; #define int long long const int maxn=1e5+5; int p[maxn];//以i为中心的回文串半径,p[i]-1为原字符串i为中心最大回文串长度 signed main() { string s=""; string now;cin>>now; s+="?"; for(int i=0;i<now.size();i++) { s+='#'; s+=now[i]; } s+="#$"; int mx=0;p[0]=0;//mx为当前最长回文序列的右端 int id=0;//为回文中心 for(int i=1;i<s.size();i++) { p[i]=1; if(i<mx){ p[i]=min(mx-i,p[2*id-i]); } while(s[i+p[i]]==s[i-p[i]]) p[i]++; if(i+p[i]>mx) { id=i; mx=p[i]+i; } } }