Submission #00353
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #include <bits/stdc++.h> using namespace std; const int base1 = 1007; const int base2 = 1009; const int mod1 = 1e9 + 7; const int mod2 = 1e9 + 9; typedef pair< int , int > T; int N, M; char word[100000][201]; char slate[100000][201]; int wlen[100000], slen[100000]; map< T, int > hashh[201]; set< T > ended[201]; int ret[100000]; bool last[100000]; bool f[200]; T commit( const T& p, char c) { return (make_pair(1LL * (p.first + c) * base1 % mod1, 1LL * (p.second + c) * base2 % mod2)); } void create( int idx) { T hashed = {0, 0}; for ( int i = 0; i < wlen[idx]; i++) { hashed = commit(hashed, word[idx][i]); hashh[i][hashed]++; } ended[wlen[idx]].insert(hashed); } int count( char *s, int idx, T t) { if (s[idx] == '\0' ) { return (ended[idx].find(t) != ended[idx].end()); } else if (s[idx] == '?' ) { int ret = 0; for ( char i = 'a' ; i <= 'z' ; i++) ret += count(s, idx + 1, commit(t, i)); return (ret); } else if (s[idx] == '*' ) { if (hashh[idx - 1].find(t) != hashh[idx - 1].end()) return (hashh[idx - 1][t]); return (0); } else { return (count(s, idx + 1, commit(t, s[idx]))); } } int main() { scanf ( "%d %d" , &N, &M); for ( int i = 0; i < N; i++) { scanf ( " %s" , word[i]); wlen[i] = strlen (word[i]); } for ( int i = 0; i < M; i++) { scanf ( " %s" , slate[i]); slen[i] = strlen (slate[i]); } for ( int k = 0; k < N; k += 1000) { for ( int i = k; i < min(k + 1000, N); i++) { create(i); } for ( int i = 0; i < M; i++) { if (slate[i][0] != '*' ) { ret[i] += count(slate[i], 0, make_pair(0, 0)); } else { last[i] = true ; } } for ( int i = 0; i < 201; i++) { hashh[i].clear(); ended[i].clear(); } } for ( int i = 0; i < N; i++) { reverse(word[i], word[i] + wlen[i]); } for ( int i = 0; i < M; i++) { if (!last[i]) continue ; reverse(slate[i], slate[i] + slen[i]); } for ( int k = 0; k < N; k += 1000) { for ( int i = k; i < min(k + 1000, N); i++) { create(i); } for ( int i = 0; i < M; i++) { if (last[i]) { ret[i] += count(slate[i], 0, make_pair(0, 0)); } } for ( int i = 0; i < 201; i++) { hashh[i].clear(); ended[i].clear(); } } for ( int i = 0; i < M; i++) { printf ( "%d\n" , ret[i]); } } |
ステータス
項目 | データ |
---|---|
問題 | 0008 - 石版 |
ユーザー名 | ei1333 |
投稿日時 | 2016-08-29 11:44:15 |
言語 | C++11 |
状態 | Accepted |
得点 | 16 |
ソースコード長 | 2448 Byte |
最大実行時間 | 4025 ms |
最大メモリ使用量 | 29456 KB |
セット
セット | 得点 | Cases | |
---|---|---|---|
1 | ALL | 16 / 16 | * |
テストケース
ファイル名 | 状態 | 実行時間 | メモリ使用量 | # |
---|---|---|---|---|
00_sample_00.in | AC | 18 ms | 2524 KB |
1
|
01_rand_00.in | AC | 21 ms | 2588 KB |
1
|
01_rand_01.in | AC | 24 ms | 2524 KB |
1
|
01_rand_02.in | AC | 20 ms | 2588 KB |
1
|
01_rand_03.in | AC | 16 ms | 2640 KB |
1
|
01_rand_04.in | AC | 20 ms | 2676 KB |
1
|
01_rand_05.in | AC | 18 ms | 2584 KB |
1
|
01_rand_06.in | AC | 16 ms | 2616 KB |
1
|
01_rand_07.in | AC | 22 ms | 2772 KB |
1
|
01_small_00.in | AC | 16 ms | 2640 KB |
1
|
02_large_00.in | AC | 94 ms | 8076 KB |
1
|
02_large_01.in | AC | 118 ms | 8248 KB |
1
|
02_large_02.in | AC | 970 ms | 24496 KB |
1
|
02_large_03.in | AC | 1189 ms | 24668 KB |
1
|
03_critical_00.in | AC | 3767 ms | 29248 KB |
1
|
03_critical_01.in | AC | 4025 ms | 29456 KB |
1
|
77_test_00.in | AC | 17 ms | 3464 KB |
1
|
77_test_01.in | AC | 19 ms | 3408 KB |
1
|
77_test_02.in | AC | 16 ms | 3356 KB |
1
|
77_test_03.in | AC | 21 ms | 3440 KB |
1
|
77_test_04.in | AC | 18 ms | 3388 KB |
1
|
77_test_05.in | AC | 24 ms | 3228 KB |
1
|
77_test_06.in | AC | 24 ms | 3456 KB |
1
|
77_test_07.in | AC | 19 ms | 3428 KB |
1
|
77_test_08.in | AC | 17 ms | 3400 KB |
1
|
77_test_09.in | AC | 14 ms | 3476 KB |
1
|
77_test_10.in | AC | 30 ms | 3552 KB |
1
|
77_test_11.in | AC | 18 ms | 3388 KB |
1
|
77_test_12.in | AC | 20 ms | 3344 KB |
1
|
77_test_13.in | AC | 21 ms | 3444 KB |
1
|
77_test_14.in | AC | 16 ms | 3416 KB |
1
|
77_test_15.in | AC | 20 ms | 3388 KB |
1
|
1000_test_00.in | AC | 18 ms | 3496 KB |
1
|
1000_test_01.in | AC | 19 ms | 3668 KB |
1
|
1000_test_02.in | AC | 21 ms | 3772 KB |
1
|
1000_test_03.in | AC | 23 ms | 3804 KB |
1
|
1000_test_04.in | AC | 29 ms | 3876 KB |
1
|
1000_test_05.in | AC | 21 ms | 3932 KB |
1
|
1000_test_06.in | AC | 19 ms | 4004 KB |
1
|
1000_test_07.in | AC | 18 ms | 3932 KB |
1
|
1000_test_08.in | AC | 25 ms | 4012 KB |
1
|
1000_test_09.in | AC | 24 ms | 4080 KB |
1
|
1000_test_10.in | AC | 23 ms | 4192 KB |
1
|