题意:
给n,m;n表示公司名字长度,M次操作
给一个字符串 表示公司名字
给m对字符
a,b ,表示把公司名字的全部a替换成b把全部b替换成a
n<=
200000
显然不能直接模拟;
因为字母只有26个,先把公司名字的每个字符的序号hash进数组,
例如 第7个字母是a ,那么 vector[a-‘a’+1].push_back(7);
再用一个26长度的数组表示当前vector的所有序号的位置的元素
例如vis[1]=‘c’;
表示vector[a]里面的元素全部被替换成c
因此每次操作我们只需要替换vis数组的值,而不需要去模拟
最后输出结果就好
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <vector>
using namespace std;
char tm[200005];
vector <int> ans[27];
int vis[27];
char final[200005];
int main()
{
int n;
char a,b;
int m;
int i,j;
scanf("%d%d",&n,&m);
scanf("%s",tm+1);
getchar();
for (i=1;i<=n;i++)
{
ans[tm[i]-'a'+1].push_back(i);
}
for (i=1;i<=26;i++)
vis[i]=i;
for (i=1;i<=m;i++)
{
scanf("%c %c",&a,&b);
getchar();
for (j=1;j<=26;j++)
{
if (vis[j]==a-'a'+1)
{
vis[j]=b-'a'+1;
}
else
if (vis[j]==b-'a'+1)
{
vis[j]=a-'a'+1;
}
}
}
for (i=1;i<=26;i++)
{
for (j=0;j<ans[i].size();j++)
{
int num=ans[i][j];
final[num]=vis[i]-1+'a';
}
}
for (i=1;i<=n;i++)
{
printf("%c",final[i]);
}
printf("\n");
return 0;
}