首页 > 其他分享 >Codeforces Round #824 (Div. 2) C - Phase Shift

Codeforces Round #824 (Div. 2) C - Phase Shift

时间:2022-10-05 21:14:26浏览次数:55  
标签:26 映射 int Shift 字母 Codeforces fa Phase define

(有点难以描述的)题意:给出一串字母,为每一个字母找一个映射,要求:1)所有的映射连起来形成一个且只有一个环;2)这个环内包含26个字母;3)映射后形成的新字符串字典序最小。

解:随便找两个26个字母的排列,再随便映射一下,可以发现:不管怎么样都是能形成环的,就是有几个的问题。题目要求只有一个,那就不要让新的字母映射到已经用过的字母上,可以用并查集实现。至于字典序尽量选小的就好。注意有字符串中26个不同字母的时候特判一下,因为到最后一个的时候不管怎么样前面的都用过一次了,这时候要把最后一个映射给没用过的。

可能还是看代码清楚一点:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define maxx 200005
#define inf 1000000009;
#define mod 998244353
char s[maxx];
int fa[30];
int find(int x){
    return fa[x]==x?x:fa[x]= find(fa[x]);
}
signed main(){
    int T;
    cin>>T;
    while(T--){
        int n;
        scanf("%d",&n);
        scanf("%s",s);
        char cnt[30]={0};
        string ans;
        for(int i=0;i<n;i++){
            if(!cnt[s[i]-'a']){
                ans+=s[i];
                cnt[s[i]-'a']++;
            }
        }
        for(int i=0;i<26;i++)
            fa[i]=i;
        int res[30]={0},cnt2[30]={0};
        for(int i=0;i<ans.length();i++){
            for(int j=0;j<26;j++){
                if(find(ans[i]-'a')!=find(j)&&!cnt2[j]){
                    res[ans[i]-'a']=j;
                    cnt2[j]++;
                    fa[ans[i]-'a']=j;
                    break;
                }
            }
        }
        if(ans.length()==26){
            for(int i=0;i<26;i++){
                if(!cnt2[i]){
                    res[ans[ans.length()-1]-'a']=i;
                    break;
                }
            }
        }
        for(int i=0;i<n;i++)
            s[i]=res[s[i]-'a']+'a';
        printf("%s\n",s);
    }
    return 0;
}
View Code

 

标签:26,映射,int,Shift,字母,Codeforces,fa,Phase,define
From: https://www.cnblogs.com/capterlliar/p/16756374.html

相关文章

  • Codeforces Round #321 (Div. 2) C. Kefa and Park(树+dfs)
    https://codeforces.com/contest/580/problem/C题目大意:给定一棵树,这棵树总共有n个节点,自己家住在节点1(根节点);每个节点都有一个标记a[i],标记为1就是这个地方有猫,0就表......
  • Codeforces 1660 D
    我是蒟蒻!我是蒟蒻!我是蒟蒻!重要的事情说三遍!传送门传送门点这儿!$\color{white}{哈哈哈!你被骗了!}$$\color{white}{真传送门在上面的感叹号!}$思路嗯?一片空白?最......
  • Codeforces Round #804 (Div. 2) C(组合 + mex)
    CodeforcesRound#804(Div.2)C(组合+mex)本萌新的第一篇题解qwq题目链接:传送门QAQ题意:给定一个\(\left[0,n-1\right]\)的排列,问有多少个排列,所有的子区间的......
  • Codeforces Round #824 (Div. 2)
    题目链接A~D懒得写。不是因为题不好,其实我觉得做起来非常舒适。但就是懒得写了(E-HousePlanning\(d_1,d_2\)全打乱感觉很难。先看看不打乱怎么做。对于每个\(i......
  • Codeforces Round #774 (Div. 2) - E. Power Board
    枚举+数论Problem-E-Codeforces题意有一个\(n*m\;(1<=n,m<=10^6)\)的矩阵,第i行第j列是\(i^j\),求这个矩阵中的\(n*m\)的数中有多少种不同的数思路......
  • Codeforces Round #785 (Div. 2) - D. Lost Arithmetic Progression
    GCDProblem-D-Codeforces题意有2个等差数列A,B,它们公有的项组成新的等差数列C;现在给出B的(首项,公差,项数)=(b,q,y),C的(首项,公差,项数)=(c,r,z)求满足条件的A的数量,如......
  • CodeForces 1527E Partition Game
    洛谷传送门CF传送门考虑朴素dp:设\(f_{i,j}\)表示分了\(j\)段且第\(j\)段的末尾是\(i\)的最小花费。有转移:\(f_{i,j}\gets\min\limits_{k=0}^{i-1}f_{k,j-1......
  • Codeforces Educational Codeforces Round 136 C D
    C一开始没有读懂题意,以为是轮流游戏,看别人翻译才发现先手在下一轮会变为反手,导致搞了半天过不了样例。可以知道如果\(n\)这张牌在Alice手中,则Alice先手打出这张牌必胜。......
  • Codeforces Round #824 (Div. 2)
    CodeforcesRound#824(Div.2)A#include<iostream>#include<algorithm>#include<cstring>#include<cmath>#defineendl'\n'usingnamespacestd;intt,n;inlin......
  • Codeforces Round #824赛时情况&赛后总结
    前两天的CF到今天才总结,还是太鸽了呢赛时首先看了题目,由于英语障碍,我还在看A题时,YSC就已经A了(我还是太逊了)。看懂后,发现A是道水题(正常),快速切掉。随后看B,阅读倒没什么障......