結果
問題 | No.1646 Avoid Palindrome |
ユーザー |
![]() |
提出日時 | 2021-08-13 22:10:44 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 1,997 ms / 3,000 ms |
コード長 | 1,444 bytes |
コンパイル時間 | 376 ms |
コンパイル使用メモリ | 31,488 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-08 15:24:20 |
合計ジャッジ時間 | 44,626 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 40 |
ソースコード
#include<stdio.h>int main(){int n;scanf("%d", &n);char s[50004];scanf("%s", s);if (n == 1){if (s[0] == '?')printf("26\n");elseprintf("1\n");return 0;}int i, j, k, l;long long int p = 998244353;long long int dp[2][26][26];for (i = 0; i < 26; i++)for (j = 0; j < 26; j++)dp[0][i][j] = 0;if (s[0] == '?' && s[1] == '?'){for (i = 0; i < 26; i++)for (j = 0; j < 26; j++)dp[0][i][j] = 1;}else if (s[1] == '?'){for (j = 0; j < 26; j++)dp[0][s[0] - 'a'][j] = 1;}else if (s[0] == '?'){for (i = 0; i < 26; i++)dp[0][i][s[1] - 'a'] = 1;}else{dp[0][s[0] - 'a'][s[1] - 'a'] = 1;}for (i = 0; i < 26; i++)dp[0][i][i] = 0;for (i = 2; i < n; i++){for (j = 0; j < 26; j++)for (k = 0; k < 26; k++)dp[1][j][k] = 0;if (s[i] == '?'){for (j = 0; j < 26; j++)for (k = 0; k < 26; k++)for (l = 0; l < 26; l++)if (l != j && l != k)dp[1][k][l] = (dp[1][k][l] + dp[0][j][k]) % p;}else{for (j = 0; j < 26; j++){for (k = 0; k < 26; k++){l = s[i] - 'a';if (l != j && l != k)dp[1][k][l] = (dp[1][k][l] + dp[0][j][k]) % p;}}}for (j = 0; j < 26; j++)for (k = 0; k < 26; k++)dp[0][j][k] = dp[1][j][k];}long long int ans = 0;for (i = 0; i < 26; i++)for (j = 0; j < 26; j++)ans = (ans + dp[0][i][j]) % p;printf("%lld\n", ans);return 0;}