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;
}