【sorting】CF855div3 2. Unforgivable Curse (hard version)

该问题描述了一个在给定字符串a和b以及交换长度k的情况下,判断是否能通过任意次数的交换使得两个字符串相等的算法问题。解决方案利用了并查集的数据结构,通过找到每个长度为k的子串的连通块,然后比较这些连通块中的字符是否相同来决定是否可能达到目标。如果所有连通块的字符都相同,则答案是“YES”,否则为“NO”。
摘要由CSDN通过智能技术生成

Problem - E2 - Codeforces

题意:

给你两个长度为n的只有英文的字符串a,b,然后给你一个k,你可以使si和s(i+k)或者si和s(i+k+1)交换,问你能否通过任意次交换,使得a,b字符串相等。

 思路:

这种定长交换有个套路,就是%K的位置都是在同一个连通块里的,因此直接并查集就行

Code:

#include <bits/stdc++.h>

using namespace std;
#define int long long
#define pii pair<int,int>
#define endl "\n"

clock_t startTime;

double getCurrentTime()
{
    return (double) (clock() - startTime) / CLOCKS_PER_SEC;
}

void solve()
{
    int n,k;cin>>n>>k;
    string s,t;cin>>s>>t;
    s="?"+s,t="?"+t;
    vector<int>f(n+5);
    for(int i=1;i<=n;i++)   f[i]=i;
    vector<vector<int>>a1(n+5),a2(n+5);
    function<int(int)>findd=[&](int x)
    {
        if(f[x]==x) return x;
        return f[x]=findd(f[x]);
    };
    for(int i=1;i<=n;i++)
    {
        if(i+k>n) break;
        f[findd(i)]=findd(i+k);
        if(i+k+1<=n)f[findd(i)]=findd(i+k+1);
    }
    for(int i=1;i<=n;i++)
    {
        a1[findd(i)].push_back(s[i]);
        a2[findd(i)].push_back(t[i]);
    }
    for(int i=1;i<=n;i++)
    {
        std::sort(a1[i].begin(), a1[i].end());
        std::sort(a2[i].begin(), a2[i].end());
        if(a1[i]!=a2[i])
        {
            cout<<"NO"<<endl;
            return;
        }
    }
    cout<<"YES"<<endl;
}

signed main()
{
    startTime=::clock();
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t = 1;
    cin >> t;
    while (t--)
        solve();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值