hihoCoder #1032 : 最长回文子串

题目分析

求最长回文串的长度,一道模板题,如果大家有谁不懂这个算法,可以到这个博客上看一下,我感觉写的非常好,仔细看一定能看懂。浅谈manacher算法

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn  = 1000005;
char P[maxn], T[maxn<<1];
int cnt[maxn<<1];

int Manacher()
{
    int len = strlen(P);
    for(int i = 0; i < len; i++)
    {
        T[i*2+1] = P[i];
        T[i*2+2] = '#';
    }
    len *= 2;
    T[0] = '#';
    int ans = 1,k;
    for(int i = 1,j = 0; i < len; )
    {
        while((i-j-1) >= 0 && T[i-j-1] == T[i+j+1]) j++;
        ans = max(ans ,cnt[i] = j);
        for(k = 1; k <= j && cnt[i-k] != cnt[i]-k; k++)
            cnt[i+k] = min(cnt[i]-k,cnt[i-k]);
        i += k;
        j = max(j-k,0);
    }
    return ans;
}

int main()
{
    int n;
    scanf("%d", &n);
    while(n--)
    {
        scanf("%s",  P);
        printf("%d\n", Manacher());
    }
    return 0;
}

你可能感兴趣的:(hihoCoder #1032 : 最长回文子串)