結果

問題 No.430 文字列検索
ユーザー h_noson
提出日時 2017-07-21 23:43:42
言語 C++17(gcc12)
(gcc 12.3.0 + boost 1.87.0)
結果
AC  
実行時間 51 ms / 2,000 ms
コード長 2,487 bytes
コンパイル時間 6,619 ms
コンパイル使用メモリ 165,540 KB
最終ジャッジ日時 2025-01-05 01:44:19
ジャッジサーバーID
(参考情報)
judge2 / judge4
純コード判定しない問題か言語
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 14
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:88:24: warning: 'matches' may be used uninitialized [-Wmaybe-uninitialized]
   88 |     cout << aho.match(s) << endl;
      |                        ^
main.cpp:64:13: note: 'matches' was declared here
   64 |         int matches;
      |             ^~~~~~~

ソースコード

diff #
プレゼンテーションモードにする

#include <iostream>
#include <vector>
#include <unordered_map>
#include <unordered_set>
#include <map>
#include <set>
#include <queue>
#include <algorithm>
#include <iomanip>
#include <cassert>
using namespace std;
#define GET_ARG(a,b,c,F,...) F
#define REP3(i,s,e) for (i = s; i <= e; i++)
#define REP2(i,n) REP3 (i,0,(int)(n)-1)
#define REP(...) GET_ARG (__VA_ARGS__,REP3,REP2) (__VA_ARGS__)
#define RREP3(i,s,e) for (i = s; i >= e; i--)
#define RREP2(i,n) RREP3 (i,(int)(n)-1,0)
#define RREP(...) GET_ARG (__VA_ARGS__,RREP3,RREP2) (__VA_ARGS__)
#define DEBUG(x) cerr << #x ": " << x << endl
struct Aho {
vector<map<char,int>> states;
vector<int> fail_path;
vector<unordered_set<string>> matched;
Aho(vector<string> dict) {
states.push_back({});
for (auto s: dict) {
int now = 0;
for (auto c: s) {
if (!states[now].count(c)) {
states[now][c] = states.size();
states.push_back({});
}
now = states[now][c];
}
matched.resize(states.size());
matched[now].insert(s);
}
fail_path.resize(states.size());
queue<int> q;
q.push(0);
while (!q.empty()) {
auto now = q.front(); q.pop();
for (auto p: states[now]) {
char c = p.first;
int next = p.second;
q.push(next);
if (now == 0) continue;
int fail = fail_path[now];
while (fail > 0 && !states[fail].count(c)) fail = fail_path[fail];
if (states[fail].count(c)) {
int x = states[fail][c];
fail_path[next] = x;
matched[next].insert(matched[x].begin(),matched[x].end());
}
}
}
}
int match(string s) {
int matches;
int now = 0;
for (auto c: s) {
while (now > 0 && !states[now].count(c)) now = fail_path[now];
if (states[now].count(c)) {
now = states[now][c];
matches += matched[now].size();
}
}
return matches;
}
};
int main(void) {
int i, j, k, m;
string s;
cin >> s >> m;
vector<string> dict;
while (m--) {
string t;
cin >> t;
dict.push_back(t);
}
Aho aho = Aho(dict);
cout << aho.match(s) << endl;
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0