結果
| 問題 |
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;
}