[ABC242] E - (∀x∀)
[Q] https://atcoder.jp/contests/abc242/tasks/abc242_e
かわいい顔文字してる。
桁DP[アルファベット26文字][ぴったり文字かどうか] = 何通り
に当てはめればいい感じ。
実装
int main() {
ll T;
cin >> T;
rep(i, T) {
ll N;
string S;
cin >> N >> S;
// 桁DP
mint DP[30][2]; // alphabet, bool
ll mid = (N + 1) / 2;
rep(j, mid) {
// 交換用の新しい桁DP
mint nDP[30][2]{};
ll c = S[j] - 'A';
// 初期だけ
if (j == 0) {
rep(k, c) { ++nDP[k][false]; }
++nDP[c][true];
} else {
// false->false
rep(k, 26) {
rep(x, 26) { nDP[x][false] += DP[k][false]; }
}
// true->false
rep(k, 26) {
if (DP[k][true] > 0) {
rep(x, c) { nDP[x][false] += DP[k][true]; }
// true->true
nDP[c][true] += DP[k][true];
break;
}
}
}
swap(nDP, DP);
}
mint ans = 0;
// こたえは、ありうるパターンの総和
rep(i, 26) rep(j, 2) { ans += DP[i][j]; }
// 最後ぴったりの回文を作ったときに、採用されるかだけ確認
// S="ABCDD" なら T="ABCBA" は採用。
// S="ABCAA" なら T="ABCBA" は不採用。
string T = S.substr(0, N / 2);
reverse(all(T));
string nT = S.substr(0, N / 2);
if (N % 2) nT += S[N / 2];
nT += T;
if (nT > S) --ans;
cout << ans << endl;
}
}
https://atcoder.jp/contests/abc242/submissions/29888967
この記事が気に入ったらサポートをしてみませんか?