zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    bzoj2434: [Noi2011]阿狸的打字机
    bzoj2830: [Shoi2012]随机树
    题解,作业*2
    bzoj1901: Zju2112 Dynamic Rankings
    luogu P4178 Tree
    CF1042C Array Product 分类讨论+贪心
    CF946D Timetable 动态规划
    CF597C Subsequences 树状数组 + 动态规划
    CF912D Fishes 期望 + 贪心
    bzoj 4321 queue2 dp
  • 原文地址:https://www.cnblogs.com/TEoS/p/14027537.html
Copyright © 2011-2022 走看看