hdu3294回文串

来源:互联网 发布:数据透视表是什么意思 编辑:程序博客网 时间:2024/06/08 02:00

http://acm.hdu.edu.cn/showproblem.php?pid=3294

给出的第一个字符是串里的a

#include <iostream>#include <cstring>#include <cstdio>#include <cmath>using namespace std;const int maxn=1000005;char s[maxn],t[maxn<<1];int Len[maxn<<1];int pos;int init(char *st){    int i,len=strlen(st);    t[0]='@';//字符串开头增加一个特殊字符,防止越界    for(i=1;i<=2*len;i+=2)    {        t[i]='#';        t[i+1]=st[i/2];    }    t[2*len+1]='#';    t[2*len+2]='$';//字符串结尾加一个字符,防止越界    t[2*len+3]=0;    return 2*len+1;//返回转换字符串的长度}//Manacher算法计算过程int manacher(char *st,int len){     int p=0,ans=0,po=0;//p即为当前计算回文串最右边字符的最大值     for(int i=1;i<=len;i++)     {         if(p>i)         Len[i]=min(p-i,Len[2*po-i]);//在Len[j]和p-i中取个小         else         Len[i]=1;//如果i>=p,要从头开始匹配         while(st[i-Len[i]]==st[i+Len[i]])         Len[i]++;         if(Len[i]+i>p)//若新计算的回文串右端点位置大于p,要更新po和mx的值         {             p=Len[i]+i;             po=i;         }         if(Len[i]>ans)         {             //ans=Len[i];            pos=i;         }         ans=max(ans,Len[i]);     }     return ans-1;//返回Len[i]中的最大值-1即为原串的最长回文子串额长度  }int main(){    char c;    while(scanf("%c%s",&c,s)!=-1)    {        getchar();        init(s);        int len=init(s);        int ans=manacher(t,len);        if(ans>1)        {            int l,r;            if(pos%2==0)            {                l=pos/2-1-ans/2;                r=l+ans-1;            }            else            {                l=(pos-ans)/2;                r=l+ans-1;            }            printf("%d %d\n",l,r);            //cout<<pos<<endl;            int t=c-'a';            for(int i=l;i<=r;i++)            {                int k=s[i]-t;                if(k>=97) printf("%c",s[i]-t);                else printf("%c",s[i]-t+26);            }            printf("\n");        }        else        printf("No solution!\n");    }    return 0;}
0 0
原创粉丝点击