結果
問題 | No.430 文字列検索 |
ユーザー | pekempey |
提出日時 | 2016-10-02 22:45:17 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 10 ms / 2,000 ms |
コード長 | 1,320 bytes |
コンパイル時間 | 1,626 ms |
コンパイル使用メモリ | 170,456 KB |
実行使用メモリ | 6,216 KB |
最終ジャッジ日時 | 2024-11-10 00:02:13 |
合計ジャッジ時間 | 2,345 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 10 ms
6,216 KB |
testcase_02 | AC | 5 ms
5,248 KB |
testcase_03 | AC | 6 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 3 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 2 ms
5,248 KB |
testcase_11 | AC | 8 ms
5,248 KB |
testcase_12 | AC | 9 ms
5,612 KB |
testcase_13 | AC | 9 ms
5,612 KB |
testcase_14 | AC | 8 ms
5,248 KB |
testcase_15 | AC | 6 ms
5,248 KB |
testcase_16 | AC | 6 ms
5,248 KB |
testcase_17 | AC | 6 ms
5,248 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; struct AhoCorasick { vector<vector<int>> succ; vector<int> fail, accept; char from, to; AhoCorasick(char from = 'a', char to = 'z') : from(from), to(to), succ(1, vector<int>(to - from + 1)), accept(1) { } void add(string s) { int curr = 0; for (char c : s) { c -= from; if (succ[curr][c] == 0) { succ[curr][c] = succ.size(); succ.push_back(vector<int>(to - from + 1)); accept.push_back(0); } curr = succ[curr][c]; } accept[curr]++; } void build() { queue<int> q; for (int c = 0; c <= to - from; c++) { if (succ[0][c] != 0) { q.push(succ[0][c]); } } fail.resize(succ.size()); while (!q.empty()) { int curr = q.front(); q.pop(); for (int c = 0; c <= to - from; c++) { int next = succ[curr][c]; if (next != 0) { q.push(next); fail[next] = succ[fail[curr]][c]; } else { succ[curr][c] = succ[fail[curr]][c]; } } accept[curr] += accept[fail[curr]]; } } }; int main() { string S; cin >> S; int m; cin >> m; AhoCorasick aho('A', 'Z'); for (int ii = 0; ii < m; ii++) { string c; cin >> c; aho.add(c); } aho.build(); int v = 0; int ans = 0; for (char ch : S) { v = aho.succ[v][ch - 'A']; ans += aho.accept[v]; } cout << ans << endl; }