hdu 3068 manacher算法

来源:互联网 发布:网络解锁nck 编辑:程序博客网 时间:2024/05/01 07:18

manacher算法可以在O(n)的时间里找出最长回文子串。
具体的manacher算法可以看这里:manacher算法

/*************************************************************************    > File Name: 3068.cpp    > Author: gwq    > Mail: gwq5210@qq.com     > Created Time: 2015年07月26日 星期日 19时24分55秒 ************************************************************************/#include <cmath>#include <ctime>#include <cctype>#include <climits>#include <cstdio>#include <cstdlib>#include <cstring>#include <map>#include <set>#include <queue>#include <stack>#include <string>#include <vector>#include <sstream>#include <iostream>#include <algorithm>#define INF (INT_MAX / 10)#define clr(arr, val) memset(arr, val, sizeof(arr))#define pb push_back#define sz(a) ((int)(a).size())using namespace std;typedef set<int> si;typedef vector<int> vi;typedef map<int, int> mii;typedef pair<int, int> pii;typedef long long ll;const double esp = 1e-5;#define N 221000int p[N];char str[N], tmp[N];#define Min(a, b) (((a) < (b)) ? (a) : (b))int manacher(char str[], int len){    int id = 0;    int mx = 0;    clr(p, 0);    for (int i = 1; i < len; ++i) {        p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;        while (str[i - p[i]] == str[i + p[i]]) {            ++p[i];        }        if (p[i] + i > mx) {            id = i;            mx = p[i] + i;        }    }    int res = 0;    for (int i = 0; i < len; ++i) {        res = max(p[i], res);    }    return res - 1;}int main(int argc, char *argv[]){    while (scanf("%s", tmp) != EOF) {        int len = 1;        str[0] = '$';        for (int i = 0; tmp[i]; ++i) {            str[len++] = '#';            str[len++] = tmp[i];        }        str[len++] = '#';        str[len] = '\0';        printf("%d\n", manacher(str, len));    }    return 0;}
0 0
原创粉丝点击