CodeForces - 591B (K - Rebranding)做题笔记

·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·
题目链接:https://cn.vjudge.net/problem/CodeForces-591B

模拟题

这题如果直接去字符串里面修改的话会超时,所以这里借鉴了字符串指针排序的思路,首先建立一个26*200 000的int数组,记录26个字母所在字符串中的位置,然后建立一个指针数组(索引)指向这个int数组的第一维,交换两个字母时,直接交换对应指针数组元素的值就行了。

贴上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
char str[200009];
int pos[26][200009];
int t[26];
int *p[26];
int *pt[26];
char get() {
char ch=getchar();
while (!isalpha(ch)) ch=getchar();
return ch;
}
int main() {
int len,m;
char c,c1,c2;
for (int i=0;i<26;i++) p[i]=pos[i];
for (int i=0;i<26;i++) pt[i]=t+i;
scanf("%d%d%*c",&len,&m);
for (int i=0;i<len;i++) {
scanf("%c",&c);
pos[c-'a'][t[c-'a']++]=i;
}
for (int i=0;i<m;i++) {
c1=get();
c2=get();
swap(p[c1-'a'],p[c2-'a']);
swap(pt[c1-'a'],pt[c2-'a']);
}
for (int i=0;i<26;i++) {
for (int j=0;j<(*pt[i]);j++)
str[p[i][j]]=i+'a';
}
str[len]='\0';
printf("%s",str);
}