CF1451C String Equality 题解

题意分析

给出两个仅由小写字母组成的字符串 $a,b$ ,可以对字符串 $a$ 的字母进行顺序变换或者把连续的 $k$ 个相同的字母换为 ASCII 码更大的字母,求 $a$ 是否能变换成 $b$ 。

思路分析

显然对于类似冒泡的操作 $1$ ,相当于可以任意变换字母的顺序,因此我们只关心各个字母的个数。因为每次只能变换 $k$ 个相同的字母,那么需要变换的每个字母个数都一定要是 $k$ 的整数倍。还要注意判断是否可以变成更大的字母,即从小到大统计字母个数和然后比较即可,若字符串 $a$ 当前字母及之前的字母的个数比 $b$ 中的要大,则需要变成更小的字母,不合法。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int T,n,k,suma,sumb;
int cnta[30],cntb[30];
string a,b;
bool pd;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&k);cin>>a>>b;
        for(int i=0;i<26;i++)
            cnta[i]=cntb[i]=0;pd=suma=sumb=0;//初始化
        for(int i=0;i<n;i++)
            cnta[a[i]-'a']++,cntb[b[i]-'a']++;//统计每个字母的个数
        for(int i=0;i<26 && !pd;i++)
            pd=(abs(cnta[i]-cntb[i])%k>0)||((suma=suma+cnta[i])<(sumb=sumb+cntb[i]));//不能被 k 整除或需要变得更小则不合法
        puts(pd?"No":"Yes");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TEoS/p/14027537.html