朴素的回文串做法1:
1 #include<bits/stdc++.h> 2 using namespace std; 3 string longestPailndrome(string &s){ 4 int Len = s.size(); //字符串长度 5 int MaxLen = 1; //最长回文字符串长度 6 int st = 0; //最长回文字符串起始地址 7 for(int i = 0 ; i < Len ; i++ ){ //枚举开始位置 8 for(int j = i+1 ; j < Len ; j++ ){ //枚举结束位置 9 int tmp1=i,tmp2=j; 10 while( tmp1 < tmp2 && s.at(tmp1) == s.at(tmp2) ){ 11 tmp1++; tmp2--; 12 } 13 if( tmp1 >= tmp2 && j-i+1 > MaxLen ){ 14 MaxLen = j-i+1 ; 15 st=i; 16 } 17 } 18 } 19 return s.substr(st,MaxLen); 20 } 21 int main() 22 { 23 ios_base::sync_with_stdio(0); 24 cin.tie(NULL); 25 string s; 26 cout<<"Input : "<<endl; 27 cin>>s; 28 cout<<" The longest palindrome : "<<endl; 29 cout<<longestPailndrome(s)<<endl; 30 } 31 /* 32 Input: 33 adacbcae 34 35 The longest palindrome : 36 acbca 37 */
朴素的回文串做法2:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e2; 4 string longestPailndrome(string &s){ 5 int Len = s.size(); //字符串长度 6 int MaxLen = 1; //最长回文字符串长度 7 int st = 0; //最长回文字符串起始地址 8 for(int C = 0 ; C < Len ;C++ ){ //中心为C,L,R两边延伸,奇数回文 9 int L=C-1,R=C+1; 10 while( L >= 0 && R < Len && s[L]==s[R]){ 11 if( R-L+1 > MaxLen ){ 12 MaxLen = R-L+1; 13 st=L; 14 } 15 L--;R++; 16 } 17 } 18 for(int C= 0 ; C < Len ;C++ ){ //中心为C,L=C,偶数回文 19 int L=C,R=C+1; 20 while( L >= 0 && R < Len && s[L]==s[R]){ 21 if( R-L+1 > MaxLen ){ 22 MaxLen = R-L+1; 23 st=L; 24 } 25 L--;R++; 26 } 27 } 28 return s.substr(st,MaxLen); 29 } 30 int main() 31 { 32 ios_base::sync_with_stdio(0); 33 cin.tie(NULL); 34 string s; 35 cout<<"Input : "<<endl; 36 cin>>s; 37 cout<<" The longest palindrome : "<<endl; 38 cout<<longestPailndrome(s)<<endl; 39 } 40 /* 41 Input: 42 adacbcae 43 44 The longest palindrome : 45 acbca 46 */
Manacher:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+100; 4 char S[N],T[N<<1]; 5 int Len[N<<1]; 6 int Manacher(char *s){ 7 int L=strlen(s),po=0,mx=0,lps=1; 8 for(int i=1;i<=L*2;i++){ 9 T[i]=i&1?'#':s[i/2-1]; 10 } 11 T[0]='@'; 12 T[2*L+1]='#'; 13 T[2*L+2]='