码迷,mamicode.com
首页 > 其他好文 > 详细

最长回文子串O(n)

时间:2014-12-12 19:03:01      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

bubuko.com,布布扣
 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <stdio.h>
 5 #include <math.h>
 6 using namespace std;
 7 
 8 int Proc(char pszIn[],char pszOut[])
 9 {
10     int nLen=1;
11     pszOut[0]=$;
12     int i=0;
13     while(pszIn[i]!=\0)
14     {
15         pszOut[nLen++]=#;
16         pszOut[nLen++]=pszIn[i];
17         i++;
18     }
19     pszOut[nLen++]=#;
20     pszOut[nLen]=0;
21     return nLen;
22 }
23 void Manacher(int *p,char *str,int len)
24 {
25     int mx=0,id=0;
26     for(int i=0;i<len;i++)
27     {
28         p[i]=mx>i?min(p[2*id-i],mx-i):1;
29         while(str[i+p[i]]==str[i-p[i]])p[i]++;
30         if(i+p[i]>mx)
31         {
32             mx=i+p[i];
33             id=i;
34         }
35     }
36 }
37 const int MAXN=2200010;
38 char strIn[MAXN];
39 char strOut[MAXN];
40 int p[MAXN];
41 int main()
42 {
43     int t;
44     scanf("%d",&t);
45     while(t--)
46     {
47         scanf("%s",strIn);
48         int nLen=Proc(strIn,strOut);
49         Manacher(p,strOut,nLen);
50         int ans=1;
51         for(int i=0;i<nLen;i++)
52             ans=max(ans,p[i]);
53         printf("%d\n",ans-1);
54     }
55     return 0;
56 }
View Code

hihocoder

最长回文子串O(n)

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/usedrosee/p/4160283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!