提出 #16537362
ソースコード 拡げる
#include <iostream>
#include <vector>
#include <array>
#include <string>
#include <functional>
template <int K, class T>
struct Trie {
struct Node {
std::array<int, K> nxt;
int id, sz, ch;
explicit Node() : id(-1), sz(0), ch(0) { nxt.fill(-1); }
};
std::vector<Node> nodes;
std::function<int(T)> enc;
std::vector<std::vector<int>> travs;
explicit Trie(T base) {
nodes.emplace_back();
enc = [=](T c) { return c - base; };
}
template <class Container>
void add(const Container& s, int id) {
int pos = 0;
for (T c : s) {
++nodes[pos].sz;
int ci = enc(c);
int npos = nodes[pos].nxt[ci];
if (npos == -1) {
npos = nodes.size();
nodes[pos].nxt[ci] = npos;
nodes.emplace_back();
++nodes[pos].ch;
}
pos = npos;
}
++nodes[pos].sz;
nodes[pos].id = id;
}
int dfs(int pos, std::vector<int>& cs) {
if (nodes[pos].id != -1) travs[nodes[pos].id] = cs;
int ret = pos;
for (int c = 0; c < K; ++c) {
int npos = nodes[pos].nxt[c];
if (npos == -1) continue;
// reducible?
bool red = (nodes[pos].ch == 1) &&
(nodes[pos].id == -1);
if (!red) cs.push_back(c);
nodes[pos].nxt[c] = dfs(npos, cs);
if (!red) {
cs.pop_back();
} else {
ret = nodes[pos].nxt[c]; // 圧縮
}
}
return ret;
}
void compress(int n) {
travs.resize(n);
std::vector<int> cs;
for (int c = 0; c < K; ++c) {
int pos = nodes[0].nxt[c];
if (pos == -1) continue;
// 根は圧縮しない
cs.push_back(c);
nodes[0].nxt[c] = dfs(pos, cs);
cs.pop_back();
}
}
Node& operator[](int pos) { return nodes[pos]; }
Node operator[](int pos) const { return nodes[pos]; }
};
void solve() {
int n;
std::cin >> n;
Trie<26, char> trie('a');
for (int i = 0; i < n; ++i) {
std::string s;
std::cin >> s;
trie.add(s, i);
}
trie.compress(n);
int q;
std::cin >> q;
while (q--) {
int k;
std::cin >> k;
--k;
std::vector<int> cs(26);
for (auto& c : cs) {
char d;
std::cin >> d;
c = d - 'a';
}
// Trieを辿る
int pos = 0, ans = 1;
for (auto c : trie.travs[k]) {
if (trie[pos].id != -1) ++ans;
for (auto d : cs) {
int npos = trie[pos].nxt[d];
if (d != c) {
if (npos != -1) ans += trie[npos].sz;
} else {
pos = npos;
break;
}
}
}
std::cout << ans << "\n";
}
}
int main() {
std::cin.tie(nullptr);
std::ios::sync_with_stdio(false);
solve();
return 0;
}
提出情報
| 提出日時 | |
|---|---|
| 問題 | E - Lexicographical disorder |
| ユーザ | Tiramister |
| 言語 | C++ (GCC 9.2.1) |
| 得点 | 1100 |
| コード長 | 3145 Byte |
| 結果 | AC |
| 実行時間 | 1050 ms |
| メモリ | 79820 KiB |
ジャッジ結果
| セット名 | Sample | All | ||||
|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 1100 / 1100 | ||||
| 結果 |
|
|
| セット名 | テストケース |
|---|---|
| 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 |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| 01.txt | AC | 126 ms | 20104 KiB |
| 02.txt | AC | 134 ms | 19916 KiB |
| 03.txt | AC | 119 ms | 19972 KiB |
| 04.txt | AC | 125 ms | 20096 KiB |
| 05.txt | AC | 167 ms | 62636 KiB |
| 06.txt | AC | 148 ms | 62504 KiB |
| 07.txt | AC | 144 ms | 62648 KiB |
| 08.txt | AC | 139 ms | 62592 KiB |
| 09.txt | AC | 139 ms | 62596 KiB |
| 10.txt | AC | 143 ms | 62664 KiB |
| 11.txt | AC | 103 ms | 9068 KiB |
| 12.txt | AC | 105 ms | 10920 KiB |
| 13.txt | AC | 107 ms | 13692 KiB |
| 14.txt | AC | 158 ms | 62588 KiB |
| 15.txt | AC | 146 ms | 62620 KiB |
| 16.txt | AC | 144 ms | 62804 KiB |
| 17.txt | AC | 150 ms | 79820 KiB |
| 18.txt | AC | 911 ms | 5156 KiB |
| 19.txt | AC | 909 ms | 5072 KiB |
| 20.txt | AC | 1039 ms | 5172 KiB |
| 21.txt | AC | 1036 ms | 5184 KiB |
| 22.txt | AC | 1050 ms | 5108 KiB |
| 23.txt | AC | 116 ms | 18160 KiB |
| 24.txt | AC | 98 ms | 9124 KiB |
| 25.txt | AC | 103 ms | 11364 KiB |
| 26.txt | AC | 739 ms | 4944 KiB |
| 27.txt | AC | 85 ms | 10760 KiB |
| 28.txt | AC | 84 ms | 10844 KiB |
| 29.txt | AC | 78 ms | 10792 KiB |
| 30.txt | AC | 104 ms | 18252 KiB |
| 31.txt | AC | 88 ms | 18192 KiB |
| 32.txt | AC | 80 ms | 18220 KiB |
| 33.txt | AC | 89 ms | 33040 KiB |
| 34.txt | AC | 81 ms | 19340 KiB |
| 35.txt | AC | 93 ms | 33008 KiB |
| 36.txt | AC | 130 ms | 21872 KiB |
| 37.txt | AC | 104 ms | 41856 KiB |
| 38.txt | AC | 103 ms | 41936 KiB |
| 39.txt | AC | 6 ms | 3520 KiB |
| 40.txt | AC | 2 ms | 3536 KiB |
| s1.txt | AC | 2 ms | 3488 KiB |
| s2.txt | AC | 2 ms | 3492 KiB |