zoukankan      html  css  js  c++  java
  • NC200546 回文串

    Code:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3  
     4 void manacher(string &ss, vector<int> &leftPart){
     5     vector<int> t(ss.size(),0);
     6     int middle=0;
     7     int rightBound=0;
     8     int len=ss.size();
     9      
    10     for(int i=1;i<len;++i){
    11         if(i<rightBound){
    12             int left=middle-(i-middle);
    13             t[i]=min(rightBound-i, t[left]);
    14         }
    15         while(i+t[i]<len && i-t[i]>=0 && ss[i+t[i]]==ss[i-t[i]]){
    16             if(ss[i+t[i]]=='#') leftPart[i+t[i]]=max(leftPart[i+t[i]],t[i]);
    17             else leftPart[i+t[i]]=max(leftPart[i+t[i]],t[i]+1);
    18              
    19             ++t[i];
    20         }
    21         --t[i];
    22         if(i+t[i]>rightBound){
    23             rightBound=i+t[i];
    24             middle=i;
    25         }
    26     }
    27 }
    28  
    29 int main(){
    30     string s;
    31     cin>>s;
    32     int N=s.size();
    33     if(N<2) {
    34         cout<<"0"<<endl;
    35         return 0;
    36     }
    37      
    38     int res=2;
    39     string ss="";
    40     for(int i=0;i<(int)s.size();++i){
    41         ss+="#";
    42         ss+=s[i];
    43     }
    44     ss+="#";
    45     int M=ss.size();
    46     vector<int> leftPart(M,0);
    47     vector<int> rightPart(M,0);
    48     for(int i=0;i<M;++i){
    49         if(ss[i]=='#'){
    50             leftPart[i]=0;
    51             rightPart[i]=0;
    52         }else{
    53             leftPart[i]=1;
    54             rightPart[i]=1;
    55         }
    56     }
    57      
    58     manacher(ss,leftPart);
    59     string reverses="";
    60     for(int i=M-1;i>=0;--i){
    61         reverses+=ss[i];
    62     }
    63     manacher(reverses,rightPart);
    64     for(int i=1;i<M;i++){
    65         leftPart[i]=max(leftPart[i],leftPart[i-1]);
    66         rightPart[i]=max(rightPart[i],rightPart[i-1]);
    67     }
    68     for(int i=1;i<M-1;++i){
    69         if(ss[i]=='#')    res=max(res,leftPart[i]+rightPart[M-1-i]);
    70     }
    71     cout<<res<<endl;
    72     return 0;
    73 }
  • 相关阅读:
    重要的环境变量
    常用的转义字符
    常用系统工作命令
    栈 队列 和 双向队列
    时间
    默认值字典
    Counter
    random
    22 内置常用模块01
    super
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12251005.html
Copyright © 2011-2022 走看看