manecher_回文串;

求回文串的o(n)算法,实质是对称;

放个链接:https://segmentfault.com/a/1190000003914228

这篇文章讲的很不错;

摘自上述文章:

..........................算了泥懣自己点开看吧;

 

求最大回文串代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char s[1000000];
 4 char ss[1000000];
 5 int p[1000000];
 6 int id,mx;
 7 int k;
 8 void manacher(char *s)
 9 {
10     int n=k;
11     //for(int i=0;i<n;i++)cout<<s[i]<<' ';
12     id=0;mx=0;
13     for(int i=1;i<n;i++)
14     {
15         if(mx>i)p[i]=min(p[2*id-i],mx-i);
16         else p[i]=1;
17         while(s[i-p[i]]==s[i+p[i]])p[i]++;
18     }
19     int idx=0,lo=0;
20     for(int i=0;i<n;i++)
21         {if(p[i]>lo)lo=p[i],idx=i;
22         //    cout<<p[i]<<' ';
23         }
24     for(int i=idx-p[idx]+1;i<idx+p[idx]-1;i++)
25     {
26         if(s[i]!='!')cout<<s[i];
27     }
28         cout<<endl;
29     return ;
30 }//12212321 
31 int main()
32 {
33     scanf("%s",&s);
34     int p=0;
35     for(int i=0;i<strlen(s);i++)
36     ss[p++]='!',ss[p++]=s[i];
37     ss[p++]='!';
38     k=p;
39     manacher(ss);
40     return 0;
41 }

很简洁使用的算法;

 

posted @ 2017-08-30 16:12  Fornic  阅读(247)  评论(0编辑  收藏  举报