最长回文( 模板 )

Posted ouyang_wsgwz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最长回文( 模板 )相关的知识,希望对你有一定的参考价值。

题目链接

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 inline ll read(){
 5     int x=0,f=1;char ch=getchar();
 6     while(ch>9||ch<0){if(ch==-)f=-1;ch=getchar();}
 7     while(ch>=0&&ch<=9){x=x*10+ch-0;ch=getchar();}
 8     return x*f;
 9 }
10 
11 /***********************************************************/
12 
13 const int maxn = 11000000;
14 char s[maxn], now[maxn*2+5];
15 int te, p[maxn*2+5];
16 
17 int manacher(char *s){
18     int len = strlen(s+1);
19     for(int i = 1;i <= len;i++){
20         now[2*i-1] = #;
21         now[2*i] = s[i];
22     }
23     len = len*2+1;
24     now[len] = #;
25     int pos = 0, r = 0;
26     for(int i = 1;i <= len;i++){
27         if(i < r) p[i] = min(p[2*pos-i], r-i);
28         else p[i] = 1;
29         while(1 <= i-p[i] && i+p[i] <= len && now[i-p[i]] == now[i+p[i]]) p[i]++;
30         if(i+p[i] > r) {
31             pos = i;
32             r = i+p[i];
33         }
34     }
35     int Max = 0;
36     for(int i = 1;i <= len;i++)
37         Max = max(Max, p[i] - 1);
38     return Max;
39 }
40 
41 int main(){
42     while(~scanf("%s", s+1)){
43         int ans = manacher(s);
44         printf("%d
", ans);
45     }   
46     return 0;
47 }

 

以上是关于最长回文( 模板 )的主要内容,如果未能解决你的问题,请参考以下文章

HDU 3068 最长回文(Manacher模板题)

hdu--3068 最长回文串(manachar模板)

最长回文 HDU - 3068 (Mannacher模板题)

hdu3068 最长回文 马拉车模板题

HDU-3068-最长回文-马拉车算法模板题

Manacher模板(O(n)内求最长回文串长度)