結果
問題 | No.599 回文かい |
ユーザー |
|
提出日時 | 2021-09-21 14:10:23 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,416 ms / 4,000 ms |
コード長 | 1,792 bytes |
コンパイル時間 | 2,404 ms |
コンパイル使用メモリ | 197,836 KB |
最終ジャッジ日時 | 2025-01-24 16:09:15 |
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 22 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:20:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 20 | scanf("%s", S); | ~~~~~^~~~~~~~~
ソースコード
#include <bits/stdc++.h>using namespace std;const int MOD = 10007;inline int mod(long long n){if(n >= 0) return n % MOD;return ((-n/MOD+1)*MOD + n) % MOD;}short arr[10000][10000];int dp[5005];bool issame = true;int L1,R1,L2,R2;char S[200001];set <int> s;int main(){scanf("%s", S);int L = strlen(S);for(int i=0;i<L;i++){s.insert(S[i]);}for(int mid=1;mid<=L;mid++){int H = 0, power = 1;for(int i=0; i<=L-mid; i++){if(i == 0){for(int j=0; j<mid; j++){H = mod(H + 1LL*S[mid-1-j]*power);if(j < mid-1) power = mod(power*2);}}else H = mod(2*(H - 1LL*S[i-1]*power) + S[i+mid-1]);arr[i][i+mid-1] = H;}}dp[0] = 1;for(int i=0;i<=(L/2);i++){for(int j=1;j<=L;j++){L1 = i;R1 = i + j - 1;R2 = L-1-i;L2 = R2-j+1;if(L2<=R1) break;issame = true;if(arr[L1][R1]==arr[L2][R2]){if(s.size()==1){dp[R1+1] += dp[i];dp[R1+1]%=1000000007;}else{for(int k=0;k<j;k++){if(S[L1+k]!=S[L2+k]){issame = false;break;}}if(issame){dp[R1+1] += dp[i];dp[R1+1]%=1000000007;}}}}}long long int res = 0;for(int i=0;i<=(L/2);i++){res += dp[i];res%=(1000000007);}cout << res << '\n';return 0;}