HYSBZ2565-最长双回文串

来源:互联网 发布:深圳压寨网络是培训么 编辑:程序博客网 时间:2024/06/07 01:04

最长双回文串

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2565  Solved: 1308
[Submit][Status][Discuss]

Description

顺序和逆序读起来完全一样的串叫做回文串。比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同)。
输入长度为n的串S,求S的最长双回文子串T,即可将T分为两部分XY,(|X|,|Y|≥1)且XY都是回文串。

Input

一行由小写英文字母组成的字符串S

Output

一行一个整数,表示最长双回文子串的长度。

Sample Input

baacaabbacabb

Sample Output

12

HINT

样例说明

从第二个字符开始的字符串aacaabbacabb可分为aacaa与bbacabb两部分,且两者都是回文串。

对于100%的数据,2≤|S|≤10^5


2015.4.25新加数据一组

Source

2012国家集训队Round 1 day2



解题思路:回文树,正反各建一次回文树即可


#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <map>#include <set>#include <stack>#include <queue>#include <vector>#include <bitset>#include <functional>using namespace std;#define LL long longconst int INF = 0x3f3f3f3f;const int maxn = 3e5 + 10;char s[maxn];int x[maxn];struct PalindromicTree{const static int maxn = 3e5 + 10;int next[maxn][26], last, sz, tot;int fail[maxn], len[maxn];char s[maxn];void Clear(){len[1] = -1; len[2] = 0;fail[2] = fail[1] = 1;last = (sz = 3) - 1;tot = 0;memset(next[1], 0, sizeof(next[1]));memset(next[2], 0, sizeof(next[2]));}int Node(int length){memset(next[sz], 0, sizeof(next[sz]));len[sz] = length;return sz;}int getfail(int x){while (s[tot] != s[tot - len[x] - 1]) x = fail[x];return x;}int add(char pos){int x = (s[++tot] = pos) - 'a', y = getfail(last);if (next[y][x]) last = next[y][x];else{last = next[y][x] = Node(len[y] + 2);fail[sz] = len[sz] == 1 ? 2 : next[getfail(fail[y])][x];sz++;}return len[last];}}solve;int main(){while (~scanf("%s", s)){int len = strlen(s), ma = 0;solve.Clear();for (int i = 0; i < len; i++) x[i + 1] = solve.add(s[i]);solve.Clear();for (int i = len - 1; i >= 0; i--)ma = max(ma, x[i] + solve.add(s[i]));printf("%d\n", ma);}return 0;}

原创粉丝点击