1. 程式人生 > >hdu 3068 最長回文

hdu 3068 最長回文

several 表示 inpu pac search pro 組成 模板 tom

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: 1358 1686 3336 3065 3746 manacher模板題。 代碼:
#include <iostream>
#include <cstring>
#include <cstdio>
#define MAX 110000
using
namespace std; int manacher(char *s,int len) { char t[MAX * 2 + 2] = {@,#}; int p[MAX * 2 + 2]; int c = 2; for(int i = 0;i < len;i ++) { t[c ++] = s[i]; t[c ++] = #; } int rp = 0,rrp = 0,ml = 0; for(int i = 1;i < c;i ++) { p[i]
= i < rrp ? min(p[rp - (i - rp)],rrp - i) : 1; while(t[i + p[i]] == t[i - p[i]]) { p[i] ++; } if(rrp < i + p[i]) { rrp = i + p[i]; rp = i; } if(ml < p[i]) { ml = p[i]; } } return ml - 1; } int main() { char s[MAX + 1]; while(~scanf("%s",s)) { printf("%d\n",manacher(s,strlen(s))); } }

hdu 3068 最長回文