Description
这一天,小A和小B在玩一个游戏,他俩每人都有一个整数,然后两人轮流对他们的整数进行操作,每次在下列两个操作任选一个:
(1)对整数进行翻转,如1234翻转成4321 ,1200翻转成21
(2)将整数除以10,如1234/10=123,1/10=0
当操作过程中出现a==b时,则小A就赢了,而操作一直进行下去或不能使a==b则算小B赢。
现在小A求助于你,想让你帮他在知道两人的整数时小A能不能赢,假设每次都是小A先手,并且两人都是采取最优策略
Input
首先输入T(T <= 100),表示有T组数据,然后接下来有T行,每行有两个整数a,b(0 <= a,b < 10100000)
Output
有T行,当小A赢了则输出"Yes",否则输出"No"
Sample Input
4 1234 123 123 321 1234 12345 123 123
Sample Output
Yes Yes No Yes
Hint
Source
Author
wsf
思路:两遍KMP,正一遍,反着再来一遍
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
using namespace std;
#define MAXN 100010
int n,m;
int slen,tlen;
char s[MAXN],t[MAXN];
int nextt[MAXN];
bool flag;
void GetNext()
{
int j = 0; nextt[1] = 0;
for (int i = 2; i <= tlen; i++)
{
while (t[i] != t[j + 1] && j > 0)
j = nextt[j];
if (t[i] == t[j + 1])
j++;
nextt[i] = j;
}
}
int main()
{
int T;
while (~scanf("%d", &T))
{
while (T--)
{
scanf("%s%s", s + 1, t + 1);
slen = strlen(s + 1);
tlen = strlen(t + 1);
while (s[slen] == '0'&&slen > 1)
s[slen--] = '\0';
while (t[tlen] == '0'&&tlen > 1)
t[tlen--] = '\0';
int j = 0; flag = false;
GetNext();
for (int i = 1; i <= slen; i++)
{
while (s[i] != t[j + 1] && j > 0)
{
j = nextt[j];
}
if (s[i] == t[j + 1] && j + 1 <= tlen)
j++;
if (j == tlen)
flag = true;
}
reverse(t + 1, t + tlen+1);
GetNext();
j = 0;
for (int i = 1; i <= slen; i++)
{
while (s[i] != t[j + 1] && j > 0)
j = nextt[j];
if (s[i] == t[j + 1] && j + 1 <= tlen)
j++;
if (j == tlen)
flag = true;
}
if (flag)
printf("Yes\n");
else
printf("No\n");
}
}
return 0;
}