最长回文 HDU - 3068 (manachar 模板)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhangxiaoduoduo/article/details/82975196

最长回文

 HDU - 3068 

给出一个只由小写英文字符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

题意:略

思路:manachar算法

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<utility>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#define maxn 220010
#define INF 0x3f3f3f3f
#define LL long long
#define ULL unsigned long long
#define E 1e-8
#define mod 1000000007
#define P pair<int,int>
#define MID(l,r) (l+(r-l)/2)
#define lson(o) (o<<1)
#define rson(o) (o<<1|1)
using namespace std;


int rad[maxn];
char str[maxn], tmpstr[maxn];

int manachar() {
    int ans = 0, mix = 0, id = 0, len = strlen(str);
    for (int i = 1; i <= len; i++) {
	if (mix > i)
	    rad[i] = min(rad[2 * id - i], mix - i);
	else
	    rad[i] = 1;

	for ( ; str[i - rad[i]] == str[i + rad[i]]; rad[i]++) {
	    if (mix < i + rad[i]) {
		mix = i + rad[i];
		id = i;
	    }
	}
	ans = max(ans, rad[i]);
    }
    return ans - 1;
}
int main() {
    while (gets(tmpstr)) {
        int len = strlen(tmpstr), cnt = 0;
        str[cnt++] = '$';
        for (int i = 0; i <= len; i++) {
            str[cnt++] = '#';
            str[cnt++] = tmpstr[i];
        }
        getchar();
        printf("%d\n", manachar());
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhangxiaoduoduo/article/details/82975196