manacher算法模板程序 HDOJ3068

xiaoxiao2021-02-28  121

最长回文

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 23931    Accepted Submission(s): 8761 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度. 回文就是正反读都是一样的字符串,如aba, abba等   Input 输入有多组case,不超过120组,每组输入为一行小写英文字符a,b,c...y,z组成的字符串S 两组case之间由空行隔开(该空行不用处理) 字符串长度len <= 110000   Output 每一行一个整数x,对应一组case,表示该组case的字符串中所包含的最长回文长度.   Sample Input aaaa abab   Sample Output 4 3   Source 2009 Multi-University Training Contest 16 - Host by NIT   Recommend lcy   |   We have carefully selected several similar problems for you:   3065  3067  3063  3064  3062  直接贴代码吧 #include <iostream> #include <cstdio> #include <cmath> #include <cstring> using namespace std; const int maxn = 110000+5; char s[maxn],s1[maxn<<1]; int a[maxn<<1]; int i,j,k,max_right,pos,len,new_len; void init(){ //构建新的字符串 len = strlen(s); pos = 0; new_len = 0; s1[0]='*'; for (i=0; i<len; i++){ s1[++new_len] = '#'; s1[++new_len] = s[i]; } s1[++new_len] = '#'; } int manacher(){ int MAX = -1; for (i=2; i<2*len+1; i++) { if (a[pos]+pos>i) a[i] = min(a[pos*2-i],a[pos]+pos-i); else a[i] = 1; while (s1[i-a[i]]==s1[i+a[i]]) a[i]++; if (pos+a[pos]<i+a[i]) pos = i; MAX = max(MAX,a[i]); } return MAX-1; } int main(){ while (scanf("%s",s)!=EOF){ init(); printf("%d\n",manacher()); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-40663.html

最新回复(0)