学习回文串

 

 

朴素的回文串做法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 : \n"<<endl;
27     cin>>s;
28     cout<<"\nThe longest palindrome :\n"<<endl;
29     cout<<longestPailndrome(s)<<endl;
30 }
31 /*
32 Input:
33 adacbcae
34 
35 The longest palindrome :
36 acbca
37 */
View Code

 

 

朴素的回文串做法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 : \n"<<endl;
36     cin>>s;
37     cout<<"\nThe longest palindrome :\n"<<endl;
38     cout<<longestPailndrome(s)<<endl;
39 }
40 /*
41 Input:
42 adacbcae
43 
44 The longest palindrome :
45 acbca
46 */
View Code

 

 

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]='\0';
14     for(int i=1;i<=2*L;i++){
15         if( i<mx )
16             Len[i]=min(mx-i,Len[2*po-i]);
17         else
18             Len[i]=1;
19         while(T[i+Len[i]]==T[i-Len[i]])
20             Len[i]++;
21         if(i+Len[i]>mx){
22             po=i;
23             mx=i+Len[i];
24         }
25         lps=max(lps,Len[i]-1);
26     }
27     return lps;
28 }
29 int main()
30 {
31     int T,LPS;
32     scanf("%d",&T);
33     while(T--){
34         scanf("%s",S);
35         LPS=Manacher(S);
36         printf("%d\n",LPS);
37     }
38     return 0;
39 }
View Code

 

posted @ 2019-08-27 11:28  Osea  阅读(201)  评论(0编辑  收藏  举报