E1. Unforgivable Curse (easy version)
https://codeforces.com/contest/1800/problem/E1
题目大意:
这是这个问题的一个简单版本。在这个版本中,k始终是3。
有两个长度为n的字符串s和c。
我们可以在k或k+1的距离内任意多次交换字符串中的的字母。在简单版本中,可以在3或4的距离交换字母【|i-j|=3或|i-j|=4,Drahyrt可以改变s中i和j位置的字母。】
问我们s是否可以变成c?
input
7
6 3
talant
atltna
7 3
abacaba
aaaabbc
12 3
abracadabraa
avadakedavra
5 3
accio
cicao
5 3
lumos
molus
4 3
uwjt
twju
4 3
kvpx
vxpk
output
YES
YES
NO
YES
NO
YES
NO
详细说明见代码内部注释部分
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL MAXN=1e18,MINN=-1e18;
const LL N=1e6+10,M=4010,P=131;
const LL mod=998244353;
const double PI=3.1415926535;
#define endl '\n'
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
int T=1;
cin>>T;
while(T--)
{
LL n,k;
cin>>n>>k;
string s,c;
cin>>s>>c;
string ss=s,cc=c;
sort(ss.begin(),ss.end());
sort(cc.begin(),cc.end());
if(ss!=cc) cout<<"NO"<<endl;//如果个数对不上或者是多了别的字符的情况
else
{
bool flag=true;
//题目中说k或者k+1的范围都可以移动,那么说明只要位置足够大,我们左移右移都可以以一格一格的方式向任意方向变动
//但是需要注意的是,一旦我们移动到边界的时候,一边足够大,我们也可以向一边扩大后继续一格一格移动
//但是如果两边都受到限制的时候,那么就只能原地呆着,这时候就只需要对比同位置的si和ci是否相等即可
for(int i=0;i<n;i++)
{
if(i-k<0&&i+k>=n)//只有会同时出界的时候才不能移动
{
if(s[i]!=c[i])//不能移动的话就需要进行对比当前位置字符是否相同
{
flag=false;//不相同的话就说明一定得移动,但是位置受限不能移动
break;
}
}
}
if(flag==false) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return 0;
}
E2. Unforgivable Curse (hard version)
https://codeforces.com/contest/1800/problem/E2
代码和E1一样