zoukankan      html  css  js  c++  java
  • 学习回文串

    朴素的回文串做法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 */
    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 : 
    "<<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 */
    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]='';
    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
    ",LPS);
    37     }
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    Linux系统主流架构一
    CentOS7.2部署KVM虚拟机
    MySQL
    MQ消息队列
    LVM
    Docker管理工具-Swarm部署记录
    Linux下DNS简单部署(主从域名服务器)
    kvm虚拟机命令梳理
    批量创建10个系统帐号tianda01-tianda10并设置密码
    随笔分类
  • 原文地址:https://www.cnblogs.com/Osea/p/11417308.html
Copyright © 2011-2022 走看看