N/A
考試一開始在找簽到題(腦子有病吧
最後還是跟着榜做的題。
隊友看了 \(L,D\),我看了 \(A\),寫完 \(D\) 機房斷網了,看別人知道了必須要重啓電腦(此時距斷網已經過了二十分鐘左右了),重啓電腦後交了 \(D\) 此時還是校內三題隊第一,校內排名也還不錯。
繼續跟榜做,寫 \(D\) 的時候隊友開了 \(J\),我就去看了 \(I\),寫了三道題的代碼名次還不錯有點懈怠了沒秒了 \(I\) 是我的錯。寫完 \(I\) 有各種各樣 \(bug\) 就虛擬打印出來去找 \(bug\) 讓隊友寫 \(J\) 了。找到了 \(I\) 的問題等隊友寫完 \(J\) 我上去改的時候忘改了一處,然後一整場沒調出來,隊友 \(J\) 也沒調出來,怎麼繪世鴨。
最後獲得了校倒數第一的好成績,成功被 \(23\) 級吊打。
題解
I
簡單 \(dp\),\(f[i][j][0/1][0/1][0/1]\) 表示前 \(i\) 位密碼且第 \(i\) 位字符爲 \(j\),是否(\(0/1\))滿足出現過大寫字母,是否(\(0/1\))滿足出現過小寫字母,是否(\(0/1\))滿足出現過數字,有多少種合法情況。空間只給了 \(32MB\),使用滾動數組就行了。轉移就是分類討論。
考場上沒想到把後三維用狀壓壓成一維,想到的話這題會不會就調出來了呢。
#include <bits/stdc++.h>
int n;
std::string s;
int cti[518], itc[101];
const int mod = 998244353;
long long in[2][2][2], ex[518][2][2][2], f[2][101][2][2][2];
int main() {
scanf("%d", &n);
std::cin >> s;
int cnt = 0;
for (int i = '0'; i <= '9'; ++i) cti[i] = cnt, itc[cnt++] = i;
for (int i = 'a'; i <= 'z'; ++i) cti[i] = cnt, itc[cnt++] = i;
for (int i = 'A'; i <= 'Z'; ++i) cti[i] = cnt, itc[cnt++] = i;
int now = 0;
if ((s[0] >= 'A' && s[0] <= 'Z') || (s[0] >= '0' && s[0] <= '9')) {
if (s[0] >= 'A' && s[0] <= 'Z') f[0][cti[s[0]]][1][0][0] = 1;
else f[0][cti[s[0]]][0][0][1] = 1;
} else if (s[0] >= 'a' && s[0] <= 'z') {
f[0][cti[s[0]]][0][1][0] = 1;
f[0][cti[s[0]] + 26][1][0][0] = 1;
} else {
for (int i = 0; i < cnt; ++i) {
if (itc[i] >= '0' && itc[i] <= '9') f[0][i][0][0][1] = 1;
else if (itc[i] >= 'a' && itc[i] <= 'z') f[0][i][0][1][0] = 1;
else f[0][i][1][0][0] = 1;
}
}
for (int j = 1; j < n; ++j) {
in[0][0][0] = 0;
in[0][0][1] = 0;
in[0][1][0] = 0;
in[0][1][1] = 0;
in[1][0][0] = 0;
in[1][0][1] = 0;
in[1][1][0] = 0;
in[1][1][1] = 0;
for (int i = 0; i <= cnt; ++i) {
in[0][0][0] = (in[0][0][0] + f[now][i][0][0][0]) % mod;
in[0][0][1] = (in[0][0][1] + f[now][i][0][0][1]) % mod;
in[0][1][0] = (in[0][1][0] + f[now][i][0][1][0]) % mod;
in[0][1][1] = (in[0][1][1] + f[now][i][0][1][1]) % mod;
in[1][0][0] = (in[1][0][0] + f[now][i][1][0][0]) % mod;
in[1][0][1] = (in[1][0][1] + f[now][i][1][0][1]) % mod;
in[1][1][0] = (in[1][1][0] + f[now][i][1][1][0]) % mod;
in[1][1][1] = (in[1][1][1] + f[now][i][1][1][1]) % mod;
}
for (int i = 0; i < cnt; ++i) {
ex[i][0][0][0] = (in[0][0][0] - f[now][i][0][0][0] + 2 * mod) % mod;
ex[i][0][0][1] = (in[0][0][1] - f[now][i][0][0][1] + 2 * mod) % mod;
ex[i][0][1][0] = (in[0][1][0] - f[now][i][0][1][0] + 2 * mod) % mod;
ex[i][0][1][1] = (in[0][1][1] - f[now][i][0][1][1] + 2 * mod) % mod;
ex[i][1][0][0] = (in[1][0][0] - f[now][i][1][0][0] + 2 * mod) % mod;
ex[i][1][0][1] = (in[1][0][1] - f[now][i][1][0][1] + 2 * mod) % mod;
ex[i][1][1][0] = (in[1][1][0] - f[now][i][1][1][0] + 2 * mod) % mod;
ex[i][1][1][1] = (in[1][1][1] - f[now][i][1][1][1] + 2 * mod) % mod;
}
now ^= 1;
for (int i = 0; i < cnt; ++i) {
f[now][i][0][0][0] = 0, f[now][i][0][0][1] = 0, f[now][i][0][1][0] = 0, f[now][i][0][1][1] = 0;
f[now][i][1][0][0] = 0, f[now][i][1][0][1] = 0, f[now][i][1][1][0] = 0, f[now][i][1][1][1] = 0;
}
if ((s[j] >= 'A' && s[j] <= 'Z') || (s[j] >= '0' && s[j] <= '9')) {
if (s[j] >= 'A' && s[j] <= 'Z') {
for (int i = 0; i < cnt; ++i) {
if (itc[i] == s[j]) continue;
if (f[now ^ 1][i][0][0][0]) (f[now][cti[s[j]]][1][0][0] += f[now ^ 1][i][0][0][0]) %= mod;
if (f[now ^ 1][i][0][0][1]) (f[now][cti[s[j]]][1][0][1] += f[now ^ 1][i][0][0][1]) %= mod;
if (f[now ^ 1][i][0][1][0]) (f[now][cti[s[j]]][1][1][0] += f[now ^ 1][i][0][1][0]) %= mod;
if (f[now ^ 1][i][0][1][1]) (f[now][cti[s[j]]][1][1][1] += f[now ^ 1][i][0][1][1]) %= mod;
if (f[now ^ 1][i][1][0][0]) (f[now][cti[s[j]]][1][0][0] += f[now ^ 1][i][1][0][0]) %= mod;
if (f[now ^ 1][i][1][0][1]) (f[now][cti[s[j]]][1][0][1] += f[now ^ 1][i][1][0][1]) %= mod;
if (f[now ^ 1][i][1][1][0]) (f[now][cti[s[j]]][1][1][0] += f[now ^ 1][i][1][1][0]) %= mod;
if (f[now ^ 1][i][1][1][1]) (f[now][cti[s[j]]][1][1][1] += f[now ^ 1][i][1][1][1]) %= mod;
}
} else {
for (int i = 0; i < cnt; ++i) {
if (itc[i] == s[j]) continue;
if (f[now ^ 1][i][0][0][0]) (f[now][cti[s[j]]][0][0][1] += f[now ^ 1][i][0][0][0]) %= mod;
if (f[now ^ 1][i][0][0][1]) (f[now][cti[s[j]]][0][0][1] += f[now ^ 1][i][0][0][1]) %= mod;
if (f[now ^ 1][i][0][1][0]) (f[now][cti[s[j]]][0][1][1] += f[now ^ 1][i][0][1][0]) %= mod;
if (f[now ^ 1][i][0][1][1]) (f[now][cti[s[j]]][0][1][1] += f[now ^ 1][i][0][1][1]) %= mod;
if (f[now ^ 1][i][1][0][0]) (f[now][cti[s[j]]][1][0][1] += f[now ^ 1][i][1][0][0]) %= mod;
if (f[now ^ 1][i][1][0][1]) (f[now][cti[s[j]]][1][0][1] += f[now ^ 1][i][1][0][1]) %= mod;
if (f[now ^ 1][i][1][1][0]) (f[now][cti[s[j]]][1][1][1] += f[now ^ 1][i][1][1][0]) %= mod;
if (f[now ^ 1][i][1][1][1]) (f[now][cti[s[j]]][1][1][1] += f[now ^ 1][i][1][1][1]) %= mod;
}
}
} else if (s[j] >= 'a' && s[j] <= 'z') {
for (int i = 0; i < cnt; ++i) {
if (itc[i] != s[j]) {
if (f[now ^ 1][i][0][0][0]) (f[now][cti[s[j]]][0][1][0] += f[now ^ 1][i][0][0][0]) %= mod;
if (f[now ^ 1][i][0][0][1]) (f[now][cti[s[j]]][0][1][1] += f[now ^ 1][i][0][0][1]) %= mod;
if (f[now ^ 1][i][0][1][0]) (f[now][cti[s[j]]][0][1][0] += f[now ^ 1][i][0][1][0]) %= mod;
if (f[now ^ 1][i][0][1][1]) (f[now][cti[s[j]]][0][1][1] += f[now ^ 1][i][0][1][1]) %= mod;
if (f[now ^ 1][i][1][0][0]) (f[now][cti[s[j]]][1][1][0] += f[now ^ 1][i][1][0][0]) %= mod;
if (f[now ^ 1][i][1][0][1]) (f[now][cti[s[j]]][1][1][1] += f[now ^ 1][i][1][0][1]) %= mod;
if (f[now ^ 1][i][1][1][0]) (f[now][cti[s[j]]][1][1][0] += f[now ^ 1][i][1][1][0]) %= mod;
if (f[now ^ 1][i][1][1][1]) (f[now][cti[s[j]]][1][1][1] += f[now ^ 1][i][1][1][1]) %= mod;
}
if (itc[i] != s[j] - 'a' + 'A') {
if (f[now ^ 1][i][0][0][0]) (f[now][cti[s[j] - 'a' + 'A']][1][0][0] += f[now ^ 1][i][0][0][0]) %= mod;
if (f[now ^ 1][i][0][0][1]) (f[now][cti[s[j] - 'a' + 'A']][1][0][1] += f[now ^ 1][i][0][0][1]) %= mod;
if (f[now ^ 1][i][0][1][0]) (f[now][cti[s[j] - 'a' + 'A']][1][1][0] += f[now ^ 1][i][0][1][0]) %= mod;
if (f[now ^ 1][i][0][1][1]) (f[now][cti[s[j] - 'a' + 'A']][1][1][1] += f[now ^ 1][i][0][1][1]) %= mod;
if (f[now ^ 1][i][1][0][0]) (f[now][cti[s[j] - 'a' + 'A']][1][0][0] += f[now ^ 1][i][1][0][0]) %= mod;
if (f[now ^ 1][i][1][0][1]) (f[now][cti[s[j] - 'a' + 'A']][1][0][1] += f[now ^ 1][i][1][0][1]) %= mod;
if (f[now ^ 1][i][1][1][0]) (f[now][cti[s[j] - 'a' + 'A']][1][1][0] += f[now ^ 1][i][1][1][0]) %= mod;
if (f[now ^ 1][i][1][1][1]) (f[now][cti[s[j] - 'a' + 'A']][1][1][1] += f[now ^ 1][i][1][1][1]) %= mod;
}
}
} else {
for (int i = 0; i < cnt; ++i) {
if(itc[i] >= 'A' && itc[i] <= 'Z') {
f[now][i][1][0][0] = (ex[i][1][0][0] + ex[i][0][0][0]) % mod;
f[now][i][1][0][1] = (ex[i][1][0][1] + ex[i][0][0][1]) % mod;
f[now][i][1][1][0] = (ex[i][1][1][0] + ex[i][0][1][0]) % mod;
f[now][i][1][1][1] = (ex[i][1][1][1] + ex[i][0][1][1]) % mod;
} else if (itc[i] >= 'a' && itc[i] <= 'z'){
f[now][i][0][1][0] = (ex[i][0][1][0] + ex[i][0][0][0]) % mod;
f[now][i][0][1][1] = (ex[i][0][1][1] + ex[i][0][0][1]) % mod;
f[now][i][1][1][0] = (ex[i][1][1][0] + ex[i][1][0][0]) % mod;
f[now][i][1][1][1] = (ex[i][1][1][1] + ex[i][1][0][1]) % mod;
} else {
f[now][i][0][0][1] = (ex[i][0][0][1] + ex[i][0][0][0]) % mod;
f[now][i][0][1][1] = (ex[i][0][1][1] + ex[i][0][1][0]) % mod;
f[now][i][1][0][1] = (ex[i][1][0][1] + ex[i][1][0][0]) % mod;
f[now][i][1][1][1] = (ex[i][1][1][1] + ex[i][1][1][0]) % mod;
}
}
}
}
if ((s[n - 1] >= 'A' && s[n - 1] <= 'Z') || (s[n - 1] >= '0' && s[n - 1] <= '9')) {
std::cout << f[now][cti[s[n - 1]]][1][1][1] % mod << '\n';
} else if (s[n - 1] >= 'a' && s[n - 1] <= 'z') {
std::cout << (f[now][cti[s[n - 1]]][1][1][1] + f[now][cti[s[n - 1] - 'a' + 'A']][1][1][1]) % mod << '\n';
} else {
long long ans = 0;
for (int i = 0; i < cnt; ++i) ans = (ans + f[now][i][1][1][1]) % mod;
std::cout << ans << '\n';
}
return 0;
}