Submission #921320
Source Code Expand
#include <bits/stdc++.h>
using namespace std;
#define _p(...) (void)printf(__VA_ARGS__)
#define forr(x,arr) for(auto&& x:arr)
#define _overload3(_1,_2,_3,name,...) name
#define _rep2(i,n) _rep3(i,0,n)
#define _rep3(i,a,b) for(int i=int(a);i<int(b);++i)
#define rep(...) _overload3(__VA_ARGS__,_rep3,_rep2,)(__VA_ARGS__)
#define _rrep2(i,n) _rrep3(i,0,n)
#define _rrep3(i,a,b) for(int i=int(b)-1;i>=int(a);i--)
#define rrep(...) _overload3(__VA_ARGS__,_rrep3,_rrep2,)(__VA_ARGS__)
#define ALL(x) (x).begin(), (x).end()
#define BIT(n) (1LL<<(n))
#define SZ(x) ((int)(x).size())
#define fst first
#define snd second
using ll=long long;using pii=pair<int,int>;using vb=vector<bool>;
using vi=vector<int>;using vvi=vector<vi>;using vvvi=vector<vvi>;
using vl=vector<ll>;using vvl=vector<vl>;using vvvl=vector<vvl>;
using vd=vector<double>;using vvd=vector<vd>;using vvvd=vector<vvd>;
using vpii=vector<pii>;using vvpii=vector<vpii>;using vvvpii=vector<vvpii>;
int i() { int i; scanf("%d", &i); return i;}
int l() { ll l; scanf("%lld", &l); return l;}
vi ia(int n) {vi ret(n); rep(i, n) scanf("%d", &ret[i]); return ret;}
vl la(int n) {vl ret(n); rep(i, n) scanf("%lld", &ret[i]); return ret;}
template <typename V> struct Trie {
const int EMPTY = -1;
vector<vector<int>> trie;
vector<V> vals;
vi num_c;
vi len;
vb end;
Trie() {
assign_new_state();
}
void add_word(const string& word, const V& val) {
int now = 0;
for (char c : word) {
c -= 'a';
if (trie[now][c] == EMPTY) {
trie[now][c] = SZ(trie);
assign_new_state();
num_c[now]++;
}
now = trie[now][c];
}
vals[now] = val;
end[now] = 1;
}
private:
void assign_new_state() {
trie.emplace_back(26, EMPTY);
vals.push_back(0);
num_c.push_back(0);
len.push_back(1);
end.push_back(0);
};
};
void Main() {
int N;
cin >> N;
Trie<int> trie;
vector<string> S(N);
rep(i, N) {
cin >> S[i];
trie.add_word(S[i], 1);
}
vi &val = trie.vals;
vvi &tri = trie.trie;
vb &end = trie.end;
vi &num_c = trie.num_c;
vi &len = trie.len;
int T = SZ(val);
rrep(i, T) {
rep(j, 26) if (tri[i][j] != trie.EMPTY) {
val[i] += val[tri[i][j]];
}
}
function<void(int)> dfs = [&](int now) {
rep(i, 26) {
int cur = tri[now][i];
if (cur != trie.EMPTY) {
if (num_c[cur] == 1 && !end[cur]) {
// 子の子が1つ
int l = 1;
while (num_c[cur] == 1 && !end[cur]) {
rep(j, 26) {
if (tri[cur][j] != trie.EMPTY) {
cur = tri[cur][j];
break;
}
}
l++;
}
//_p("%d:%d: %d\n", now, i, cur);
tri[now][i] = cur;
len[tri[now][i]] = l;
}
dfs(tri[now][i]);
}
}
};
dfs(0);
//rep(ii,SZ(tri)) { cout << "tri["<<ii<<"]:"; rep(jj, SZ(tri[ii])) cout << ' ' << tri[ii][jj]; cout << endl; }
//cout << "len:"; rep(ii,SZ(len)) cout << ' ' << len[ii]; cout << endl;
//cout << "val:"; rep(ii,SZ(val)) cout << ' ' << val[ii]; cout << endl;
int Q;
cin >> Q;
while (Q--) {
int k; string p;
cin >> k >> p;
k--;
const string &s = S[k];
vector<vb> t(26, vb(26));
rep(i, 26) {
char f = p[i];
rep(j, i+1, 26) {
char l = p[j];
t[f-'a'][l-'a'] = 1;
t[l-'a'][f-'a'] = 0;
}
}
//cout<<"s: "<<s<<endl;
int n = SZ(s);
int now = 0;
int ans = 0;
int pos = 0;
while (pos < n) {
int c = s[pos] - 'a';
//_p("%d\n", c);
rep(i, 26) if (tri[now][i] != trie.EMPTY) {
if (t[i][c]) {
ans += val[tri[now][i]];
}
}
if (end[now]) ans++;
now = tri[now][c];
pos += len[now];
}
cout << ans+1 << endl;
}
}
int main() { cin.tie(0); ios::sync_with_stdio(false); Main(); return 0; }
Submission Info
Submission Time
2016-10-10 22:49:09+0900
Task
E - Lexicographical disorder
User
shiratty8
Language
C++14 (GCC 5.4.1)
Score
1100
Code Size
4072 Byte
Status
AC
Exec Time
3371 ms
Memory
59560 KB
Compile Error
./Main.cpp: In function ‘int i()’:
./Main.cpp:23:33: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int i() { int i; scanf("%d", &i); return i;}
^
./Main.cpp: In function ‘int l()’:
./Main.cpp:24:34: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
int l() { ll l; scanf("%lld", &l); return l;}
^
./Main.cpp: In function ‘vi ia(int)’:
./Main.cpp:25:56: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
vi ia(int n) {vi ret(n); rep(i, n) scanf("%d", &ret[i]); return ret;}
^
./Main.cpp: In function ‘vl la(int)’:
./Main.cpp:26:58: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
vl la...
Judge Result
Set Name
Sample
All
Score / Max Score
0 / 0
1100 / 1100
Status
Set Name
Test Cases
Sample
s1.txt, s2.txt
All
01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt, 39.txt, 40.txt, s1.txt, s2.txt
Case Name
Status
Exec Time
Memory
01.txt
AC
1004 ms
20912 KB
02.txt
AC
1007 ms
20912 KB
03.txt
AC
1000 ms
20912 KB
04.txt
AC
1000 ms
20912 KB
05.txt
AC
1073 ms
46632 KB
06.txt
AC
1052 ms
58664 KB
07.txt
AC
1045 ms
59304 KB
08.txt
AC
1012 ms
59432 KB
09.txt
AC
1029 ms
59432 KB
10.txt
AC
1011 ms
59256 KB
11.txt
AC
957 ms
6840 KB
12.txt
AC
945 ms
9652 KB
13.txt
AC
958 ms
12596 KB
14.txt
AC
1050 ms
55976 KB
15.txt
AC
1020 ms
59560 KB
16.txt
AC
1011 ms
59256 KB
17.txt
AC
979 ms
59272 KB
18.txt
AC
2909 ms
1280 KB
19.txt
AC
2897 ms
1280 KB
20.txt
AC
3362 ms
1408 KB
21.txt
AC
3353 ms
1408 KB
22.txt
AC
3371 ms
1408 KB
23.txt
AC
990 ms
13364 KB
24.txt
AC
956 ms
6968 KB
25.txt
AC
959 ms
9652 KB
26.txt
AC
2791 ms
1280 KB
27.txt
AC
947 ms
7092 KB
28.txt
AC
942 ms
9396 KB
29.txt
AC
923 ms
8884 KB
30.txt
AC
971 ms
14768 KB
31.txt
AC
950 ms
18736 KB
32.txt
AC
918 ms
13104 KB
33.txt
AC
922 ms
22704 KB
34.txt
AC
915 ms
18352 KB
35.txt
AC
919 ms
24492 KB
36.txt
AC
987 ms
23472 KB
37.txt
AC
946 ms
30272 KB
38.txt
AC
964 ms
30272 KB
39.txt
AC
3 ms
256 KB
40.txt
AC
3 ms
256 KB
s1.txt
AC
3 ms
256 KB
s2.txt
AC
3 ms
256 KB