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
AC × 16
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