题意:给定一个字符串A和B,现在你可以任意选定A中的一个位置index,使得一个字符串C中只有A[index],现在你有两种操作:①当A[index+1]合法时,你可以向右移动,使得index++,并将A[index]放入C的末尾,②当A[index-1]合法时,你可以左移移动,使得index–,并将A[index]放入C的末尾,需要注意的是:你向右移动后还可以向左移动,一旦以向左移动,就不能再向右移动
解法:模拟搜索就可
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<map>
#include<set>
//#define int long long
using namespace std;
inline int max(int a, int b) { return (a > b) ? a : b; }
inline int min(int a, int b) { return (a < b) ? a : b; }
const int N = 1e5 + 100;
string str1, str2;
int len, len2;
bool dfs(int index, int sum, bool flag) {
if (sum == len2) return true;;
if (flag && index != len - 1 && str1[index + 1] == str2[sum]) if (dfs(index + 1, sum + 1, true)) return true;
if (index != 0 && str1[index - 1] == str2[sum])if (dfs(index - 1, sum + 1, false))return true;
return false;
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
cin >> str1 >> str2;
len = str1.length();
len2 = str2.length();
//cout << len << " " << len2 << endl;
bool sign = false;
for (int i = 0; i < str1.length(); i++) {
if (str1[i] == str2[0]) {
sign = dfs(i, 1, true);
if (sign) break;
}
}
if (sign) cout << "YES" << endl;
else cout << "NO" << endl;
}
}