Code Forces 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;
}

你可能感兴趣的:(Code Forces 591 B. Rebranding(简单模拟))