zoukankan      html  css  js  c++  java
  • HDU3068 最长回文 Manacher算法

      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068

      直接用Manacher算法解决即可,先构造字符串,例如 abc -> $#a#b#c#  ,第一个‘$’是为了防止溢出字符串。其实也可以不构造字符串,直接去Manacher,具体做法是,当 i 为奇数时为‘#’,为偶数时再去比较。

     1 //STATUS:C++_AC_281MS_1348KB
     2 #include<stdio.h>
     3 #include<stdlib.h>
     4 #include<string.h>
     5 #include<math.h>
     6 #include<iostream>
     7 #include<string>
     8 #include<algorithm>
     9 #include<vector>
    10 #include<queue>
    11 #include<stack>
    12 #include<map>
    13 using namespace std;
    14 #define LL __int64
    15 #define pii pair<int,int>
    16 #define Max(a,b) ((a)>(b)?(a):(b))
    17 #define Min(a,b) ((a)<(b)?(a):(b))
    18 #define mem(a,b) memset(a,b,sizeof(a))
    19 #define lson l,mid,rt<<1
    20 #define rson mid+1,r,rt<<1|1
    21 const int N=110010,INF=0x3f3f3f3f,MOD=10000,STA=8000010;
    22 const double DNF=1e13;
    23 
    24 char str[N<<1],s[N];
    25 int p[N<<1];
    26 int n,len;
    27 
    28 void Manacher(char *str,int *p)
    29 {
    30     int i,j,id,mx;
    31     id=1,mx=1;
    32     p[0]=p[1]=1;
    33     for(i=2;i<n;i++){
    34         p[i]=1;
    35         if(mx>i){
    36             p[i]=Min(p[(id<<1)-i],mx-i);
    37         }
    38         while(str[i+p[i]]==str[i-p[i]])p[i]++;
    39         if(i+p[i]>mx){
    40             id=i;
    41             mx=i+p[i];
    42         }
    43     }
    44 }
    45 
    46 void getstr(char *s)
    47 {
    48     int i;
    49     str[0]='$';str[1]='#';
    50     for(i=0;i<len;i++){
    51         str[(i<<1)+2]=s[i];
    52         str[(i<<1)+3]='#';
    53     }
    54     str[n]=0;
    55 }
    56 
    57 int main()
    58 {
    59  //   freopen("in.txt","r",stdin);
    60     int i,j,ans;
    61     while(~scanf("%s",s))
    62     {
    63         len=strlen(s);
    64         n=len*2+2;
    65         getstr(s);
    66         Manacher(str,p);
    67 
    68         ans=1;
    69         for(i=2;i<n;i++){
    70             ans=Max(ans,p[i]-1);
    71         }
    72 
    73         printf("%d\n",ans);
    74         getchar();
    75         getchar();
    76     }
    77     return 0;
    78 }
  • 相关阅读:
    XML 学习(二)
    maven运用,在eclipse中将maven本地仓库加入,创建maven项目
    windows提权
    windows文件权限问题
    更换tomcat版本遇到问题解决方法
    服务器安装vmware遇到的问题
    windows远程账户禁用/允许/隐藏
    使用maven下载jar包
    编写WebService 并发布到IIS中
    一些有趣的javascript小测试
  • 原文地址:https://www.cnblogs.com/zhsl/p/3012318.html
Copyright © 2011-2022 走看看