2017福建省赛Problem D Game(KMP)

来源:互联网 发布:卖家网是淘宝的吗 编辑:程序博客网 时间:2024/05/16 13:29
【题目链接】FZU
【题意】有A、B两个数,可以对数字进行倒置或除以10的操作,Alice可以操作A,Bob可以操作B,轮流操作,Alice先操作。如果最后AB相同就Alice获胜,否则Bob。
【样例】
【分析】
就是判断字符串B是否包含在字符串A或A逆中。KMP模板题。需要特别判断一下B=0的情况。
【代码】
#include<cstdio>#include<cstring>#include<algorithm>#include <iostream>#include <string>using namespace std;int f[100005];void getfill(string s){    memset(f,0,sizeof(f));  //根据其前一个字母得到    for(int i=1;i<s.size();i++){        int j=f[i];        while(j&&s[i]!=s[j])            j=f[j];        f[i+1]=(s[i]==s[j])?j+1:0;    }}int find(string a,string s){    int ans=0;    getfill(s);int j=0;    for(int i=0;i<a.size();i++){        while(j&&a[i]!=s[j])            j=f[j];        if(a[i]==s[j])            j++;        if(j==s.size()){            ans++;            break;        }    }    return ans;}int main(){    string s,a;    int T;    scanf("%d",&T);    while(T--){        getchar();        cin>>s>>a;        int ans=find(s,a);        if(a[0]=='0'){            printf("Alice\n");            continue;        }        if(ans==1)            printf("Alice\n");        else{            reverse(a.begin(),a.end());            int ans=find(s,a);            if(ans==1){                printf("Alice\n");            }            else{                printf("Bob\n");            }        }    }    return 0;}

【说明】直接套了个模板然后wa了。在大佬的指点下才发现B=0这个特殊的情况,应该说才发现所有数最后都可以变成0。
阅读全文
0 0
原创粉丝点击