FZU

来源:互联网 发布:乐视盒子有线网络设置 编辑:程序博客网 时间:2024/06/18 16:15

题目大意就是给Alice和Bob一人一个字符串,每个人每回合可以对自己的字符串进行两种操作中的一种,反转字符串或删除字符串末尾的那个数,字符串删完将变为“0”

正反KMP两次就好了,如果Alice的字符串包含了Bob的字符串或者包含了Bob翻转后的字符串,那么Alice就可以向Bob步步逼近最后取得胜利,注意题目说的是双方任意一人操作后若两人字符串相同则Alice胜利(一开始还看错了以为必须得是Alice操作完才算胜利)

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;char t[100005];char w[100005];int Next[100005];int lent,lenw;void getnext(){    Next[0]=Next[1]=0;    for(int i=1;i<lenw;i++)    {        int j=Next[i];        while(j&&w[i]!=w[i])            j=Next[j];        if(w[i]==w[j])            Next[i+1]=j+1;        else            Next[i+1]=0;    }}bool kmp(){    int j=0;    for(int i=0;i<lent;i++)    {        while(j&&t[i]!=w[j])            j=Next[j];        if(t[i]==w[j])            j++;        if(j==lenw)            return true;    }    return false;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        scanf("%s%s",t,w);        lent=strlen(t);        lenw=strlen(w);        if(lent<lenw)        {            printf("Bob\n");            continue;        }        if(lenw==1&&w[0]=='0')        {            printf("Alice\n");            continue;        }        getnext();        if(kmp())        printf("Alice\n");        else        {            strrev(w);            getnext();            if(kmp())                printf("Alice\n");            else                printf("Bob\n");        }    }    return 0;}


原创粉丝点击