• hdu3294 Manacher算法模板


    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/3294/

    回文长度如果是mxx,回文中心是id的话,在扩展串中(id-mxx+1,id+mxx-1)的这段中去除标记符号的部分就是回文串。还有个注意点就是错位循环赋值的问题。

    代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef unsigned int ui;
     4 typedef long long ll;
     5 typedef unsigned long long ull;
     6 #define pf printf
     7 #define mem(a,b) memset(a,b,sizeof(a))
     8 #define prime1 1e9+7
     9 #define prime2 1e9+9
    10 #define pi 3.14159265
    11 #define lson l,mid,rt<<1
    12 #define rson mid+1,r,rt<<1|1
    13 #define scand(x) scanf("%llf",&x) 
    14 #define f(i,a,b) for(int i=a;i<=b;i++)
    15 #define scan(a) scanf("%d",&a)
    16 #define dbg(args) cout<<#args<<":"<<args<<endl;
    17 #define inf 0x3f3f3f3f
    18 #define maxn 200010
    19 int n,m,t;
    20 char s[maxn],ma[maxn<<1];
    21 int Len[maxn<<1];
    22 int mxx,id;//最大回文半径和中心 
    23 void init(char c,char* s)
    24 {
    25     int len=strlen(s);
    26     f(i,0,len-1)
    27     {
    28         s[i]=(char)('a'+(s[i]-c+26)%26);
    29     }
    30 }
    31 void manacher(char* s,int len)
    32 {
    33     int l=0;
    34     ma[l++]='$';
    35     ma[l++]='#';
    36     f(i,0,len-1)
    37     {
    38         ma[l++]=s[i];
    39         ma[l++]='#';
    40     }
    41     ma[l]=0;
    42     int pos=0,mr=0;
    43     mxx=0;
    44     f(i,0,l-1)
    45     {
    46         Len[i]=(mr>i)?min(mr-i,Len[2*pos-i]):1;
    47         while(ma[i+Len[i]]==ma[i-Len[i]])Len[i]++; 
    48         if(i+Len[i]>mr)mr=i+Len[i],pos=i;
    49         if(Len[i]-1>mxx)
    50         {
    51             mxx=Len[i]-1;
    52             id=i;
    53         }
    54     }
    55 }
    56 int main()
    57 {
    58     //freopen("input.txt","r",stdin);
    59     //freopen("output.txt","w",stdout);
    60     std::ios::sync_with_stdio(false);
    61     char c;
    62     while(scanf(" %c %s",&c,s)==2)
    63     {
    64         init(c,s);
    65         int len=strlen(s);
    66         int ansl=0,ansr=0;
    67         manacher(s,len);
    68         if(mxx==1)pf("No solution!
    ");//回文长度是1 
    69         else 
    70         {
    71             int l=(id-mxx+1)/2-1;
    72             int r=(id+mxx-1)/2-1;
    73             pf("%d %d
    ",l,r);
    74             f(i,l,r)pf("%c",s[i]);
    75             pf("
    ");
    76 //            f(i,id-mxx+1,id+mxx-1)pf("%c",ma[i]);
    77 //            pf("
    ");
    78         }
    79     }
    80  } 
  • 相关阅读:
    [翻译] DZNSegmentedControl
    GONMarkupParser的使用
    使用@selector模仿代理功能降低代码耦合度
    编译并导入OpenSSL
    [翻译] TLTagsControl
    [控件] BookTextView
    [控件] AngleGradientView
    【转】jQuery属性过滤选择器
    【转】ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
    【转】PHP----JS相互调用
  • 原文地址:https://www.cnblogs.com/randy-lo/p/12521212.html
Copyright © 2020-2023  润新知