ZZULIOJ-1961 斗破苍穹(马拉车算法)

来源:互联网 发布:s2011网络设置 编辑:程序博客网 时间:2024/06/10 04:30

求最长回文串

#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#include <queue>#define maxn 100005using namespace std;char str[maxn], ch[maxn<<1];int len[maxn<<1];void Init(){    int j = 0;    scanf("%s", str);    ch[0] = '@';    for(int i = 0; str[i]; i++){        ch[++j] = '#';        ch[++j] = str[i];    }    ch[++j] = '#';    ch[++j] = 0;}int Manacher(){    int mex = 0, id, ans = 0;    for(int i = 1; ch[i]; i++){        if(mex > i)           len[i] = min(len[2*id-i], mex-i);        else          len[i] = 1;        while(ch[i+len[i]] == ch[i-len[i]])           len[i]++;        if(i + len[i] > mex){            mex = i + len[i];            id = i;            ans = max(ans, len[i]-1);        }    }    return ans; }int main(){//  freopen("in.txt", "r", stdin);    int t;    cin >> t;    while(t--){        Init();        cout << Manacher() << endl;    }    return 0;}
0 0