• hdu 3068最长回文


    使用o(n)的manacher算法,详见代码

     1 #include<cstdio>  
     2 #include<iostream>  
     3 #include<algorithm>
     4 #include<math.h> 
     5 #include<string.h>  
     6 #include<vector> 
     7 #include<queue>
     8 #include<iterator>
     9 #include<vector>
    10 #include<set>
    11 #define dinf 0x3f3f3f3f
    12 typedef long long ll;
    13 //const int Max=(1<<16)+10;
    14 using namespace std;
    15 #define SIZE 1000005
    16 
    17 
    18 char tmp[SIZE],s[SIZE];//tmp存变换后的串,s存原串 
    19 int p[SIZE];//存以mid为中心的回文串的长度 
    20 
    21 
    22 void init()
    23 {
    24     int slen=strlen(s);
    25     tmp[0]='$';        //头标记防止越界 
    26     for(int i=1,j=0;i<=2*slen+1;i+=2)
    27     {
    28         tmp[i]='#';
    29         tmp[i+1]=s[j++];
    30     }
    31     tmp[2*slen+2]='#';//尾标记 
    32 }
    33 
    34 int manacher()
    35 {
    36     int mid=0,mx=0,ans=0;//mx为当前计算回文串最右边字符位置最大值 
    37     int tlen=strlen(s)*2+1;
    38     for(int i=1;i<=tlen;i++)
    39     {
    40         if(mx>i)
    41             p[i]=min(mx-i,p[2*mid-i]);
    42         else        //i>mx从头开始匹配 
    43             p[i]=1;
    44         while(tmp[i-p[i]]==tmp[i+p[i]])
    45             p[i]++;
    46         if(p[i]+i>mx)//计算得到的右端点值大于mx则进行更新 
    47         {
    48             mx=p[i]+i;
    49             mid=i;
    50         }
    51         ans=max(ans,p[i]);
    52     }
    53     return ans-1;//p[i]-1即最长回文串的长度 
    54 }
    55 
    56 int main()
    57 {
    58     while(scanf("%s",&s)!=EOF)
    59     {
    60         init();
    61         printf("%d
    ",manacher());
    62     }
    63     return 0;
    64 }
  • 相关阅读:
    Servlet梳理一
    String和StringBuffer的区别
    谈谈面对将要来到的第一份工作
    shell grep文本搜索
    Shell cut分割
    python的学习之路:计算
    web端和手机端测试有什么不同
    让TortoiseGit记住帐号密码方法
    操纵IE,模拟用户登录
    MVC路由配置.html不能识别
  • 原文地址:https://www.cnblogs.com/pter/p/5694828.html
Copyright © 2020-2023  润新知