题目:戳一戳
题意:a b两个字符串,对于a, b 中不匹配的位置,能否通过滚动的方式把他们进行匹配
题解:将a字符串中不匹配的位置中的子序列提出来然后在原来的子序列后面再加一遍,那么就可以把b中不匹配的子序列跟这个a的新子序列进行匹配了
以后做字符串相对位置不变,判断匹配的问题,可以把原来的s=s+s,这样进行匹配!
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<string>
#include<fstream>
#include<vector>
#include<stack>
#include <map>
#include <iomanip>
#define bug cout << "**********" << endl
#define show(x,y) "["<<x<<","<<y<<"]"
//#define LOCAL = 1;
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll mod = 1e6 + 3;
const int Max = 1e5 + 10;
int t, n, m;
char str1[Max], str2[Max];
char s1[Max], s2[Max];
int Next[Max];
void getNext(int tot)
{
Next[0] = -1;
int k = -1;
int j = 0;
while (j < tot)
{
if (k == -1 || s1[j] == s1[k])
{
Next[++j] = ++k;
}
else
{
k = Next[k];
}
}
}
bool check(int tot)
{
getNext(tot);
int i = 0, j = 0;
while (i < 2 * tot && j < tot)
{
if (j == -1 || s2[i] == s1[j])
{
i++, j++;
}
else
{
j = Next[j];
}
}
return j == tot;
}
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scanf("%d", &t);
while (t--)
{
scanf("%d%s%s", &n, str1, str2);
int tot = 0;
for (int i = 0;i < n;i++)
{
if (str1[i] != str2[i])
{
s1[tot] = str1[i];
s2[tot++] = str2[i];
}
}
s1[tot] = s1[0];
bool ok = true;
for (int i = 1;i <= tot; i++)
{
if (s1[i] != s2[i - 1])
ok = false;
}
if (ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}