CodeForces 591 B. Rebranding(简单模拟)

Description
给出一个长度为n,全部由小写字母组成的字符串,现对其做m次操作,每次操作输入两个小写字母xi,yi,需将字符串中所有的xi变成yi,将所有的yi变成xi,输出操作后的字符串
Input
第一行为两个整数n和m分别表示字符串长度以及操作数,第二行为一长度为n的字符串,之后m行每行两个小写字母表示一次操作(1 ≤ n, m ≤ 200 000)
Output
输出m次操作后的字符串
Sample Input
6 1
police
p m
Sample Output
molice
Solution
暴力时间复杂度O(n*m)显然不行,所以可以简单模拟这个变化过程,记录这m次操作最后一次变换完成所有操作,具体实现就是将原字符串中的字母与操作后的字母做一个双射函数,f1[i]表示操作后的字母f1[i]对应原字符串中的字母i,f2为f1的反函数,f2[i]表示原字符串中的字母f2[i]对应操作后的字母i,每次操作输入x[i],y[i],只需swap(f1[xi-‘a’],f2[yi-‘a’]),至于f和f2的转化很简单,f2[f1[i]-‘a’]=i+’a’,最后输出f2[s[i]-‘a’]即可,时间复杂度O(n+m)
Code

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 222222
int n,m;
char f1[27],f2[27],s[maxn],a,b;
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        scanf("%s",s);
        for(int i=0;i<26;i++)
            f1[i]=i+'a';
        while(m--)
        {
            scanf(" %c %c",&a,&b);
            swap(f1[a-'a'],f1[b-'a']);
        }
        for(int i=0;i<26;i++)
            f2[f1[i]-'a']=i+'a';
        for(int i=0;i<n;i++)
            printf("%c",f2[s[i]-'a']);
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值