HDU 3294 manacher

来源:互联网 发布:spring resource和java 编辑:程序博客网 时间:2024/05/22 15:14

给定一个字符和一个字符串,求转化后字符串出现的第一个最长回文(即有很多相同长度,输出第一个),并输出起始终点位置,以及转化后的回文串。

manacher算法求得最长回文串的长度mxx以及该回文串的中心位置iid,原位置为(iid-mxx+1)/2-1~(iid+mxx-1)/2-1.

#include <bits/stdc++.h>using namespace std;const int maxn =200000+50;char s[maxn];char Ma[maxn*2];int Mp[maxn*2];int mxx,iid; void manacher(char s[],int len) {    mxx=-1;    int l=0;    Ma[l++]='$';    Ma[l++]='#';    for(int i=0;i<len;i++)    {        Ma[l++]=s[i];        Ma[l++]='#';    }    Ma[l]=0;    int mx=0,id=0;    for(int i=0;i<l;i++)    {        Mp[i]=mx>i?min(Mp[2*id-i],mx-i):1;        while(Ma[i+Mp[i]]==Ma[i-Mp[i]])Mp[i]++;        {           if(i+Mp[i]>mx)            {                mx=i+Mp[i];                id=i;            }            if(Mp[i]-1>mxx)            {                mxx=Mp[i]-1;                iid=i;            }        }    } }int main(){    char c;    while(~scanf(" %c%s",&c,s))    {        int k = c-'a';        int len=strlen(s);        for(int i=0;i<len;i++)        {            s[i]-=k;            if(s[i]<'a')                s[i]+=('z'-'a'+1);        }        manacher(s,len);        if(mxx==1)         printf("No solution!\n");        else        {            printf("%d %d\n",(iid-mxx+1)/2-1,(iid+mxx-1)/2-1);            for(int i=(iid-mxx+1)/2-1;i<=(iid+mxx-1)/2-1;i++)            printf("%c",s[i]);            printf("\n");        }    }}


原创粉丝点击