zoukankan      html  css  js  c++  java
  • Codeforces Round #685 (Div. 2) C

    Codeforces Round #685 (Div. 2) C

    大意

    给你长度都为 (N) 且只有小写字母的字符串 (a,b) ,和一个数字 (k)

    你可以对 (a) 进行如下操作:

    1. 交换相邻两个字符的位置
    2. 将连续 (k) 个相同的字符变成下一个字符,无法从 (z) 变为 (a)

    问:

    是否可以让 (a) 在任意次数的变换后和 (b) 相等。

    思路

    首先,由操作一可以推出任意两个字符的位置都可以被调换。

    那么无需考虑 (a,b) 中字符的相对位置,仅需考虑字符的数量关系。

    从z到a考虑,(a,b) 中每个字母数量的差值都应该是 (k) 的倍数。

    其次,因为 (a) 中字母只能从小往大升,所以说从大往小考虑过程中 (b) 的字母总数量一定时刻都要大于等于 (a) 的字母总数量。

    代码

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    using namespace std;
    
    #define ll long long
    #define ull unsigned long long
    #define cint const int&
    #define Pi acos(-1)
    
    const int mod = 998244353;
    const int inf_int = 0x7fffffff;
    const ll inf_ll = 0x7fffffffffffffff;
    const double ept = 1e-9;
    
    int t, n, k;
    string a, b;
    int sum[27][2];
    
    int main() {
        cin >> t;
        while(t--) {
            memset(sum, 0, sizeof sum);
            cin >> n >> k >> a >> b;
            for(int i=0; i<n; i++)
                ++sum[a[i]-'a'+1][0], ++sum[b[i]-'a'+1][1];
            int s=0;
            bool flag=0;
            for(int i=26; i && !flag; i--) {
                if(abs(sum[i][1]-sum[i][0])%k) flag=1;
                else s += sum[i][1]-sum[i][0];
                if(s<0) flag=1;
            }
            if(!flag) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    BZOJ1000 A+B Problem
    网络最大流
    树形结构
    BZOJ2521 最小生成树 最小割
    HDU5266 LCA 树链剖分LCA 线段树
    BZOJ3991 寻宝游戏 LCA 虚树 SET
    深度优先搜索DFS
    斯特林数
    Noip2017 普及 T3 Chess
    键盘自动机
  • 原文地址:https://www.cnblogs.com/ullio/p/14021010.html
Copyright © 2011-2022 走看看