首页 > 其他 > 详细

Manacher

时间:2019-05-15 19:33:11      阅读:128      评论:0      收藏:0      [点我收藏+]

  

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 3e5;
 4 char s[maxn], str[maxn];
 5 int len1, len2, p[maxn], ans;
 6 
 7 void init(){
 8     str[0] = $;
 9     str[1] = #;
10     for(int i=0; i<len1; i++){
11         str[i*2+2] = s[i];
12         str[i*2+3] = #;
13     }
14     len2 = len1 << 1 + 2;
15     str[len2] = *;
16 }
17 void manacher(){
18     int id=0, mx=0;
19     for(int i=1; i<len2; i++){
20         if(mx>i)p[i]=min(p[id<<1-i], mx-i);
21         else p[i]=1;
22         for(;str[i+p[i]] == str[i-p[i]];p[i]++);
23         if(p[i]+i > mx){
24             mx=p[i]+i;
25             id = i;
26         }
27     }
28 }
29 int main(){
30     //freopen("in", "r", stdin);
31     while(scanf("%s", s), strcmp(s,"end")){
32         len1 = strlen(s);
33         init();
34         manacher();
35         for(int i=0; i<len2; i++)
36             ans = max(ans, p[i]);
37         printf("%d\n", ans);
38     }
39 }

 

Manacher

原文:https://www.cnblogs.com/Kingpenguin/p/10871464.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!