AT_abc342_c 题解

· · 题解

赛时思路

提交记录:

思路

首先创建一个字符类型的映射数组 m,然后下标代表字母,内容存储要替代的字符,比如说,字符 a 要变成字符 r,那么 m 数组中下标为 a 的地方存储的是 r。

首先进行初始化 m 数组,字母下标 x 存储的就是字母 x。

然后把每一步操作进行存储。

因为后面的操作会影响一开始的操作,所以使用倒推法。

从 q 遍历到 1,对于每一次操作,将 m_{c_i} 存储的字母变为 m_{d_i}。

为什么是 m_{d_i} 呢?举个例子:a \rightarrow r,r \rightarrow w,如果赋值为 d_i,那么就是错的,a 还是替换成 r 还需要遍历一次字符串,但如果是 m_{d_i},那么 a\rightarrow r\rightarrow w,这样就对了。

最后逐位输出 m_{s_i} 即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
map<char,char> m;
int main(){
    int n;
    cin>>n;
    for(int i='a'; i<='z'; i++){
        m[(char)i]=(char)i;
    }
    string s;
    cin>>s;
    int q;
    cin>>q;
    char c[200005],d[200005];
    for(int i=1; i<=q; i++) cin>>c[i]>>d[i];
    for(int i=q; i>=1; i--){
        m[c[i]]=m[d[i]];
    }
    for(int i=0;i<n;i++){
        cout<<m[s[i]];
    }
    return 0;
}