【回文串】HDU 3294 Girls' research manacher算法

来源:互联网 发布:而又何羡乎特殊句式 编辑:程序博客网 时间:2024/05/17 23:49

点击打开链接

O(n) 复杂度

#include <cstdio>#include <cstring>#include <cstdlib>#include <string>#include <iostream>#include <algorithm>#include <sstream>#include <cmath>using namespace std;#include <queue>#include <stack>#include <vector>#include <deque>#include <set>#include <map>#define cler(arr, val)    memset(arr, val, sizeof(arr))#define FOR(i,a,b)  for(int i=a;i<=b;i++)#define IN   freopen ("in.txt" , "r" , stdin);#define OUT  freopen ("out.txt" , "w" , stdout);typedef long long  LL;const int MAXN = 510011;const int MAXM = 6000010;const int INF = 0x3f3f3f3f;const LL mod = 2147483647;const double eps= 1e-8;const double pi=acos(-1.0);#define lson l,m, rt<<1#define rson m+1,r,rt<<1|1char s[201000];char c[410200],in;int p[410002];int len;void solve(){    c[0]='@';    for(int i=0;i<len;i++)        c[i*2+1]='#',c[i*2+2]=s[i]=(s[i]-in+26)%26+'a';    len=2*len+2;    c[len-1]='#';    c[len]=0;    int mx=0,id=0;    for(int i=1;i<len;i++)    {        if(mx>i)            p[i]=min(p[2*id-i],p[id]+id-i);        else p[i]=1;        while(c[i+p[i]]==c[i-p[i]])            p[i]++;        if(i+p[i]>mx)            mx=i+p[i],id=i;    }    int ans=0;    for(int i=1;i<len;i++)        if(p[ans]<p[i]) ans=i;    int len=p[ans]-1;    if(len==1) puts("No solution!");    else    {        int l=(ans+1)/2-1-len/2;        printf("%d %d\n",l,l+len-1);        for(int i=l;i<l+len;i++)            printf("%c",s[i]);        puts("");    }}int main(){    while(scanf("%c %s",&in,s)!=EOF)    {        getchar();        len=strlen(s);        solve();    }    return 0;}


0 0
原创粉丝点击