2021 ICPC 沈陽站 E, F題
第一場區域賽,清楚自己的實力,在隊里說兩題就算贏,最后確實兩題。貼一下比賽的代碼,之后補題。
E題 簽到
暴力字符串,找 "edgnb" 的個數
#include<bits/stdc++.h>
#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<bits/stdc++.h>
#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 一下
之后補完題再貼代碼
總結
很多知識點都沒有學習,想題時也做了不少無用功,各方面都需要提高。
這學期的算法競賽暫告一段落了,日常還是要練習,以免手生,寒假再花時間集中學習訓練,繼續努力吧!