zoukankan      html  css  js  c++  java
  • Manacher算法

    fl说今天是20200202,是个回文串,lzz应该整理一下回文串算法,于是整理一下马拉车。

    很简单的回文字符串寻找算法,纯原创板子,返回信息最全,已过HDU上的板题,清除了上一次的残余信息而可多次调用。

     1 #include<bits/stdc++.h> 
     2 #define pf printf
     3 #define f(i,a,b) for(int i=a;i<=b;i++)
     4 using namespace std;
     5 const int maxn=110005;
     6 char ma[maxn];
     7 char tem[maxn<<1];
     8 int mp[maxn<<1];
     9 void manacher(char ma[],int mp[],int len,int &maxlen,int &maxstart,int &maxend){
    10     maxlen=-1;
    11     tem[0]='$';
    12     tem[1]='#';
    13     int l=2;
    14     f(i,1,len){
    15         tem[i<<1]=ma[i-1];
    16         tem[(i<<1)+1]='#';
    17     }
    18     int maxright=0,id=0;
    19     len=1+(len<<1);
    20     tem[len+1]='';
    21     f(i,0,len){
    22         if(i<maxright){
    23             if(maxright-i>mp[(id<<1)-i]){
    24                 mp[i]=mp[(id<<1)-i];
    25                 if(i+mp[i]>maxright){
    26                     id=i;
    27                     maxright=i+mp[i];
    28                 }
    29             }
    30             else if(maxright-i<mp[(id<<1)-i]){
    31                 mp[i]=maxright-i;
    32                 if(i+mp[i]>maxright){
    33                     id=i;
    34                     maxright=i+mp[i];
    35                 }
    36             }
    37             else{
    38                 mp[i]=maxright-i;
    39                 while(tem[i+mp[i]]==tem[i-mp[i]]){
    40                     mp[i]++;
    41                 }
    42                 if(i+mp[i]>maxright){
    43                     id=i;
    44                     maxright=i+mp[i];
    45                 }
    46             }
    47         }
    48         else{
    49             mp[i]=1;
    50             while(tem[i+mp[i]]==tem[i-mp[i]]){
    51                 mp[i]++;
    52             }
    53             if(i+mp[i]>maxright){
    54                 id=i;
    55                 maxright=i+mp[i];
    56             }
    57         }
    58         if(mp[i]-1>maxlen){
    59             maxlen=mp[i]-1;
    60             maxstart=(i-maxlen)/2;
    61         }
    62     }
    63     maxend=maxstart+maxlen-1;
    64 }
    65 int main(){
    66     while(~scanf("%s",ma)){
    67         int len=strlen(ma);
    68         int maxstart,maxend,maxlen;
    69         manacher(ma,mp,len,maxlen,maxstart,maxend);
    70         pf("%d
    ",maxlen);
    71 //        f(i,maxstart,maxend){
    72 //            pf("%c",ma[i]);
    73 //        }
    74 //        pf("
    ");
    75     }
    76 }
  • 相关阅读:
    0302思考并回答一些问题
    1231 实验四 递归下降语法分析程序设计
    1118 实验三 有限自动机的构造与识别
    1112对他人的博客评论及建议
    1029c语言文法
    1022词法分析实验总结
    词法分析
    0330 复利计算——单元测试
    0321 读《构建之法》第一,二,三章有感
    0316 复利计算总结(0330 更新)
  • 原文地址:https://www.cnblogs.com/St-Lovaer/p/12245272.html
Copyright © 2011-2022 走看看