HDU - 3294 Girls' research(manacher)

来源:互联网 发布:网络负面处理 编辑:程序博客网 时间:2024/04/30 19:37

题目大意:要求你求出一个字符串的最长回文子串,并将最长回文子串按要求经过转码输出

解题思路:manacher的裸题

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 400010;char str[N], tmp[10];int p[N];int len;void init() {    len = strlen(str);    for (int i = len; i >= 0; i--) {        str[i * 2 + 2] = str[i];        str[i * 2 + 1] = '#';    }    str[0] = '$';}void solve() {    int mx = 0, id, ansid, mxp = 0;    for (int i = 2; i < len * 2 + 1; i++) {        if (mx > i) p[i] = min(p[id * 2 - i], mx - i);        else p[i] = 1;        while (str[i - p[i]] == str[i + p[i]]) p[i]++;        if (p[i] > mxp) {            mxp = p[i];            ansid = i;        }        if (p[i] + i >= mx) {            mx = p[i] + i;            id = i;        }    }    if (p[ansid] - 1 < 2) printf("No solution!\n");    else {        printf("%d %d\n", (ansid - p[ansid] + 2) / 2 - 1, (ansid + p[ansid] - 2) / 2 - 1);        int k = tmp[0] - 'a';        for (int i = ansid - p[ansid] + 2; i <= ansid + p[ansid] - 2; i += 2)            printf("%c", (str[i] - 'a' - k + 26) % 26 + 'a');        printf("\n");    }}int main() {    while (scanf("%s%s", tmp, str) != EOF) {        init();        solve();    }    return 0;}
0 0
原创粉丝点击