#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
#include<iostream>
#include<string>
#include<set>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
#include<algorithm>
#include<time.h>
using namespace std;
void fre(){freopen("c://test//input.in","r",stdin);freopen("c://test//output.out","w",stdout);}
#define MS(x,y) memset(x,y,sizeof(x))
#define MC(x,y) memcpy(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define ls o<<1
#define rs o<<1|1
typedef long long LL;
typedef unsigned long long UL;
typedef unsigned int UI;
template <class T> inline void gmax(T &a,T b){if(b>a)a=b;}
template <class T> inline void gmin(T &a,T b){if(b<a)a=b;}
const int N=2e5+10,M=0,Z=1e9+7,ms63=1061109567;
int n,m;
char s[N];
char a[128],x,y;//a[i]表示一开始是i的字符最后变成了什么
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i='a';i<='z';i++)a[i]=i;
scanf("%s",s);
for(int i=1;i<=m;i++)
{
scanf(" %c %c",&x,&y);
for(int i='a';i<='z';i++)
{
if(a[i]==x)a[i]=y;
else if(a[i]==y)a[i]=x;
}
}
for(int i=0;s[i];i++)s[i]=a[s[i]];
puts(s);
}
return 0;
}
/*
【题意】
给你一个长度为n(2e5)的串,串中只包含小写字母。
我们先后进行了m(2e5)次替代,
对于每次替代规则(x,y),把当前为x的字符变成字符y,并把当前为y的字符变成字符x。
问你经过这m次替代之后,串变成了什么模样并输出。
【类型】
暴力
【分析】
显然不能模拟。
首先观察到,一开始是某个char类型的,最后都会变成相同的char类型。
于是我们需要用a[x]表示初始字符是x,最终变成的字符。
这样,对于每个替代规则(x,y),我们扫描一下a['a'~'z'],把a[i]==x的变为a[i]=y,把a[i]==y的变为a[i]=x。
就可以AC啦。
字符集果然是简化复杂度的一大重要突破口。
【时间复杂度&&优化】
O(26m)
【数据】
Input
6 1
police
p m
Output
molice
Input
11 6
abacabadaba
a b
b c
a d
e g
f a
b b
Output
cdcbcdcfcdc
*/
【Codeforces Round #327 (Div. 2) B】 Rebranding 字符变换 同类型打标记
最新推荐文章于 2022-11-22 23:15:14 发布