kmp + 思维

爱丽丝和鲍勃正在玩一个游戏。

他们每个人都有一个号码。Alice的号码是A,Bob的号码是B.

每回合,一名球员可以对自己的号码执行以下操作之一:

1.翻转:翻转号码。假设X = 123456,翻转后X = 654321

2.划分。X = X / 10。注意所有的数字都是整数。例如X = 123456,在这个动作之后X变为12345(但不是12345.6)。0/0 = 0。

Alice和Bob依次移动,Alice先移动。爱丽丝只能修改A,鲍勃只能修改B.如果A = B后任何玩家的动作,则爱丽丝赢。否则,游戏继续!

爱丽丝想赢得比赛,但鲍勃会尽力阻止爱丽丝。

假设Alice和Bob足够聪明,现在Alice想知道她是否能以有限的步骤赢得比赛,否则游戏永远不会结束。

输入

第一行包含一个整数T(1≤T≤10),表示有T个测试用例。

对于每个测试用例:两个数字A和B. 0 <= A,B <= 10 ^ 100000。

产量

对于每个测试案例,如果爱丽丝可以赢得游戏,输出“爱丽丝”。否则输出“Bob”。

示例输入
4
11111 1
1 11111
12345 54321
123 123
示例输出
爱丽丝
短发
爱丽丝
爱丽丝
暗示

对于第三个样本,Alice翻转他的号码并赢得比赛。

对于最后一个样本,A = B,所以即使没有人采取行动,爱丽丝也会立即赢得比赛。



①首先将Bob的数字串去掉后缀0.

②然后判断Bob的数字串是否为0.如果是输出Alice否则进入步骤③

③将Alice的数字串和Bob的数字串进行KMP匹配,正反各一次即可,如果包含了Bob的数字串,输出Alice,否则输出Bob.



#include <iostream>

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
char a[10000005],b[10000005],c[10000005];
int f[10000005];
int main()
{
    int n;
    long long int d,e,i,j;
    scanf("%d",&n);
    while(n--)
    {
        int ge=0;
        scanf("%s%s",a,b);
        d=strlen(a);
        e=strlen(b);
        for(i=e-1; i>=0; i--)
            if(b[i]=='0')
            {
                ge++;
                b[i]=0;
            }
            else
                break;
        e=e-ge;
        if(b[0]==0)
            printf("Alice\n");
        else
        {
            f[0]=-1;
            for(i=1; i<=e-1; i++)
            {
                j=f[i-1];
                while(b[j+1]!=b[i]&&j>=0)
                    j=f[j];
                if(b[j+1]==b[i])
                    f[i]=j+1;
                else
                    f[i]=-1;
            }
            
            i=0;
            j=0;
            int z=1;
            while(i<d)
            {
                if(a[i]==b[j])
                {
                    i++;
                    j++;
                    if(j==e)
                    {
                        z=2;
                        break;
                    }
                }
                else
                {
                    if(j==0)
                        i++;
                    else
                        j=f[j-1]+1;
                }
            }
            if(z==2)
                printf("Alice\n");
            else
            {
                reverse(b,b+e);
                
                i=0;
                j=0;
                int z1=1;
                while(i<d)
                {
                    if(a[i]==b[j])
                    {
                        i++;
                        j++;
                        if(j==e)
                        {
                            z1=2;
                            break;
                        }
                    }
                    else
                    {
                        if(j==0)
                            i++;
                        else
                            j=f[j-1]+1;
                    }
                    
                }
                if(z1==2)
                    printf("Alice\n");
                else
                    printf("Bob\n");
            }


        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/najiuzheyangbaacm/article/details/80244625
kmp