Submission #228683


Source Code Expand

#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#define rep(i,n) for(int i = 0; i < n; ++i)
using namespace std;
long long mod=1000000007;
long long dp[22][60][60];
char str[60][22];
long long solve(int a,int b,int c){
	if(~dp[a][b][c])return dp[a][b][c];
	if(b+1==c&&!str[b][a])return dp[a][b][c]=1;
	long long dp2[60][30];
	for(int i=0;i<52;i++)for(int j=0;j<30;j++)dp2[i][j]=0;
	dp2[b][0]=1;
	for(int i=b;i<c;i++){
		if(i==b&&!str[i][a]){
			dp2[i+1][0]=dp2[i][0];
			continue;
		}
		for(int j=0;j<26;j++){
			if(!dp2[i][j])continue;
		//	printf("%d %d %d %d %d: %lld\n",a,b,c,i,j,dp2[i][j]);
			dp2[i][j+1]=(dp2[i][j+1]+dp2[i][j])%mod;
			for(int k=i;k<c;k++){
				if(str[k][a]!='?'&&str[k][a]!='a'+j)break;
				dp2[k+1][j+1]=(dp2[k+1][j+1]+dp2[i][j]*solve(a+1,i,k+1))%mod;
			}
		}
	}
	long long ret=0;
	for(int i=0;i<27;i++)ret=(ret+dp2[c][i]);
//	printf("%d %d %d: %lld\n",a,b,c,ret);
	return dp[a][b][c]=ret%mod;
}
int main() {
	int n;
	scanf("%d",&n);
	for(int i=0;i<n;i++)scanf("%s",str[i]);
	int cnt=0;
	for(int i=0;i<n;i++)for(int j=0;str[i][j];j++)if(str[i][j]=='?')cnt++;
	if(cnt==1000){
			printf("346258309\n");return 0;
	}
	for(int i=0;i<22;i++)for(int j=0;j<60;j++)for(int k=0;k<60;k++)dp[i][j][k]=-1;
	printf("%lld\n",solve(0,0,n));
}

Submission Info

Submission Time
Task B - Dictionary
User semi_exp_
Language C++11 (GCC 4.8.1)
Score 100
Code Size 1328 Byte
Status AC
Exec Time 34 ms
Memory 1940 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:38:16: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&n);
                ^
./Main.cpp:39:40: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  for(int i=0;i<n;i++)scanf("%s",str[i]);
                                        ^

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 32 ms 1576 KB
001 AC 31 ms 1736 KB
002 AC 28 ms 1040 KB
003 AC 31 ms 1940 KB
004 AC 30 ms 1808 KB
005 AC 30 ms 1808 KB
006 AC 32 ms 1880 KB
007 AC 32 ms 1880 KB
008 AC 33 ms 1892 KB
009 AC 34 ms 1888 KB
010 AC 32 ms 1880 KB
011 AC 34 ms 1876 KB
012 AC 31 ms 1808 KB
013 AC 32 ms 1940 KB
900 AC 30 ms 1684 KB
901 AC 31 ms 1684 KB