Submission #228617
Source Code Expand
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <queue>
using namespace std;
typedef long long i64;
typedef vector<int> ivec;
#define MOD 1000000007
#define ADD(X,Y) ((X) = ((X) + (Y) % MOD) % MOD)
int N;
string S[50];
char in[30];
i64 dp[51][51][21][30]; // [L][R][i][j] S[L, R) beginning with i-th char, we can use aux+j, aux+j+1, ...
char aux = '`';
i64 solve(int L, int R, int p, int q)
{
if (dp[L][R][p][q] != -1) return dp[L][R][p][q];
i64 ret = 0;
if (L >= R) {
return dp[L][R][p][q] = 1;
}
if (q == 27) return dp[L][R][p][q] = 0;
if (p == 20) {
return dp[L][R][p][q] = (R - L == 1 ? 1 : 0);
}
ADD(ret, solve(L, R, p, q + 1));
for (int i = L + 1; i <= R; ++i) {
//[L, i) <- q
if (S[i - 1][p] != aux + q && S[i - 1][p] != '?') break;
if (S[i - 1][p] == '?' && q == 0) break;
ADD(ret, solve(L, i, p + 1, 0) * solve(i, R, p, q + 1));
}
//printf("%d %d %d %d %lld\n", L, R, p, q, ret);
return dp[L][R][p][q] = ret;
}
int main()
{
scanf("%d", &N);
for (int i = 0; i < N; ++i) {
scanf("%s", in);
S[i] = in;
while (S[i].size() < 20) S[i].push_back(aux);
}
for (int i = 0; i <= N; ++i)
for (int j = 0; j <= N; ++j)
for (int k = 0; k <= 20; ++k)
for (int l = 0; l < 30; ++l) dp[i][j][k][l] = -1;
i64 ret = solve(0, N, 0, 0);
printf("%lld\n", ret);
return 0;
}
Submission Info
| Submission Time |
|
| Task |
B - Dictionary |
| User |
Operasan |
| Language |
C++11 (GCC 4.8.1) |
| Score |
100 |
| Code Size |
1477 Byte |
| Status |
AC |
| Exec Time |
390 ms |
| Memory |
13612 KiB |
Compile Error
./Main.cpp: In function ‘int main()’:
./Main.cpp:54:17: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%d", &N);
^
./Main.cpp:56:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", in);
^
Judge Result
| Set Name |
All |
| Score / Max Score |
100 / 100 |
| Status |
|
| Set Name |
Test Cases |
| All |
000, 001, 002, 003, 004, 005, 006, 007, 008, 009, 010, 011, 012, 013, 900, 901 |
| Case Name |
Status |
Exec Time |
Memory |
| 000 |
AC |
23 ms |
920 KiB |
| 001 |
AC |
22 ms |
928 KiB |
| 002 |
AC |
390 ms |
13612 KiB |
| 003 |
AC |
28 ms |
4252 KiB |
| 004 |
AC |
27 ms |
4008 KiB |
| 005 |
AC |
32 ms |
5364 KiB |
| 006 |
AC |
23 ms |
1300 KiB |
| 007 |
AC |
23 ms |
936 KiB |
| 008 |
AC |
31 ms |
6000 KiB |
| 009 |
AC |
28 ms |
4484 KiB |
| 010 |
AC |
23 ms |
1700 KiB |
| 011 |
AC |
23 ms |
1820 KiB |
| 012 |
AC |
23 ms |
1440 KiB |
| 013 |
AC |
22 ms |
1316 KiB |
| 900 |
AC |
22 ms |
928 KiB |
| 901 |
AC |
22 ms |
932 KiB |