2021 ICPC 沈阳站 ( E, F题 )
2021 ICPC 沈阳站 E, F题
第一场区域赛,清楚自己的实力,在队里说两题就算赢,最后确实两题。贴一下比赛的代码,之后补题。
E题 签到
暴力字符串,找 "edgnb" 的个数
#include
#define IO_FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using namespace std;
int main()
{
IO_FAST
string s;
cin >> s;
int cnt = 0;
int len = s.size() - 4;
for(int i = 0; i < len; i++) {
if(s[i] == 'e' && s[i+1] == 'd' && s[i+2] == 'g' && s[i+3] == 'n' && s[i+4] == 'b') cnt++;
}
cout << cnt << '\n';
return 0;
}
F题 Encoded String I
题目大意:定义一种编码方式,字符串 S 中每种字母 ch 最后一次出现的位置之后有 i 种字母,就把所有的 ch 变为第 i + 1 个字母。
给你一个长度为 n 的字符串 S,求 S 的 n 个前缀编码后字典序最大的前缀。
从后往前,把每个前缀编码,然后比较大小,n <= 1000,暴力可过
AC代码
#include
#define IO_FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
using namespace std;
typedef long long ll;
int chk[25];
char change[25];
int main()
{
// IO_FAST
int n;
string str, ans = "";
cin >> n >> str;
for(int j = n - 1; j >= 0; j--) {
string s = str.substr(0, j + 1);
int cnt = 0;
for(int i = j; i >= 0; i--) {
if(chk[s[i] - 'a']) s[i] = change[s[i] - 'a'];
else {
chk[s[i] - 'a'] = 1;
change[s[i] - 'a'] = cnt + 'a';
s[i] = change[s[i] - 'a'];
cnt++;
}
}
memset(chk, 0, sizeof(chk));
if(s > ans || ans == "") ans = s;
}
cout << ans << '\n';
return 0;
}
之后还开了 B 题和 J 题,都没写出来。
B 题去构造数组,看题解是用二分图染色,知识盲区。
J 题是给两个四位数密码,求前一个转到后一个密码的最小次数,相邻的数字可以一起转
题解是只有四位数从 0000 开始总共才 10000 种方案,BFS 一下
之后补完题再贴代码
总结
很多知识点都没有学习,想题时也做了不少无用功,各方面都需要提高。
这学期的算法竞赛暂告一段落了,日常还是要练习,以免手生,寒假再花时间集中学习训练,继续努力吧!