第八届福建大学生程序设计竞赛-D Game(博弈论+kmp)

来源:互联网 发布:免费相册集制作软件 编辑:程序博客网 时间:2024/05/17 03:27

题目链接:http://acm.fzu.edu.cn/contest/problem.php?cid=156&sortid=4

题目大意:又见Alice Bob,1.数字反转 2.数字除十  每次每个人只能选择一个操作,问在有限的次数能谁能取得胜利。

题目思路:只要找完Alice胜利的所有状态,那么剩下的都是Bob胜利。

Alice胜利的情况:1.Bob是Alice的子串或者Bob是Alice逆置的子串 

                 2.当Bob的字符串长度为1且字符串的内容为0

学到的东西:Alice Bob = 博弈论 ,数字这么长,想想kmp

代码:

#include <iostream>#include <string>#include <cstdio>using namespace std;const int maxn=10000;int fail[maxn];void getFail(string zi){    fail[0]=0,fail[1]=0;    for(int i=1;i<zi.size();i++){        int j=fail[i];        while(j&&zi[i]!=zi[j])            j=fail[j];        fail[i+1]=zi[i]==zi[j]?j+1:0;    }}bool kmp(string fu,string zi){    getFail(zi);    int j=0;    for(int i=0;i<fu.size();i++){        while(j&&zi[j]!=fu[i]) j=fail[j];        if(zi[j]==fu[i]) j++;        if(j==zi.size()) return true;    }    return false;}int main(){    string fu;    string zi;    string fu2;    int t;cin>>t;    while(t--){        bool is=false;        cin>>fu>>zi;        if(fu.size()>=zi.size()){            is=kmp(fu,zi);            if(!is){                for(int j=fu.size()-1;j>=0;j--)                    fu2.push_back(fu[j]);                is = kmp(fu2,zi);            }        }        if(zi.size()==1&&zi[0]=='0') is = true;        if(is) cout<<"Alice"<<endl;        else cout<<"Bob"<<endl;    }}



阅读全文
1 0
原创粉丝点击