hdu 3294 Girls' research

来源:互联网 发布:sql存储过程语法 编辑:程序博客网 时间:2024/05/21 15:42

这道题,拉马车的基础。。
但是一开始爆炸了,因为自己手贱写了一句memset。。
因为v【i】这个东西源自id,而id必定滞后于i,所以不需要初始化。。

#include<cstdio>#include<iostream>#include<cstring>using namespace std;int v[1001000*2];char test[1001000*2];char ch[2];int main(){    while(scanf("%s %s",ch,test)!=EOF)    {        int len=strlen(test);        for(int i=len;i>=0;i--)        {            test[i*2+2]=test[i];            test[i*2+1]='#';        }        test[0]='*';        int id=0;        int maxlen=0;        int maxwho;        for(int i=1;i<=len*2;i++)        {            if(v[id]+id>i)            {                v[i]=min(v[id-(i-id)],v[id]-(i-id));            }            else            {                v[i]=1;            }            while(test[i+v[i]]==test[i-v[i]])            {                v[i]++;            }            if(v[id]+id<v[i]+i)            {                id=i;            }            if(v[i]>maxlen)            {                maxlen=v[i];                maxwho=i;            }        }        maxlen--;        if(maxlen==1)        {            printf("No solution!\n");        }        else        {            int left=(maxwho-maxlen)/2;            int right=(maxwho+maxlen)/2-1;//这里就体现出拉马车的强大了,因为它统一了奇数位和偶数位的情况。。            printf("%d %d\n",left,right);            int zhan=ch[0]-'a';            for(int i=left*2+2;i<=right*2+2;i=i+2)            {                if(test[i]!='*'&&test[i]!='#')                {                    test[i]=test[i]-zhan;                    if(test[i]<'a')                    {                        test[i]+=26;                    }                    printf("%c",test[i]);                }            }            printf("\n");        }    }    return 0;}
0 0