Codeforces Round #855 (Div. 3) E1 E2

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一样

posted @ 2023-03-04 11:59  高尔赛凡尔娟  阅读(116)  评论(0编辑  收藏  举报