HDOJ 2222 Keywords Search
2015-04-04 09:27
274 查看
题意:给出n个模式串和一个主串,求匹配个数
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222
思路:AC自动机模板题(直接上bin神模板)
注意点:无
以下为AC代码:
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222
思路:AC自动机模板题(直接上bin神模板)
注意点:无
以下为AC代码:
Run ID | Submit Time | Judge Status | Pro.ID | Exe.Time | Exe.Memory | Code Len. | Language | Author |
13035505 | 2015-03-05 16:56:00 | Accepted | 2222 | 920MS | 31636K | 3771 B | G++ | luminous11 |
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <iostream> #include <cstring> #include <cstdio> #include <string> #include <vector> #include <deque> #include <list> #include <map> #include <set> #include <queue> #include <stack> #include <cmath> #include <ctime> #include <cctype> #include <climits> #include <iomanip> #include <cstdlib> #include <algorithm> //#include <unordered_map> //#include <unordered_set> #define ll long long #define ull unsigned long long #define all(x) (x).begin(), (x).end() #define clr(a, v) memset( a , v , sizeof(a) ) #define pb push_back #define RDI(a) scanf ( "%d", &a ) #define RDII(a, b) scanf ( "%d%d", &a, &b ) #define RDIII(a, b, c) scanf ( "%d%d%d", &a, &b, &c ) #define RS(s) scanf ( "%s", s ) #define PIL(a) printf ( "%d\n", a ) #define PIIL(a,b) printf ( "%d %d\n", a, b ) #define PIIL(a,b,c) printf ( "%d %d %d\n", a, b, c ) #define PSL(s) printf ( "%s\n", s ) #define REP(i,m,n) for ( int i = m; i <= n; i ++ ) #define DEP(i,m,n) for ( int i = m; i >= n; i -- ) #define REPI(i,m,n,k) for ( int i = m; i <= n; i += k ) #define DEPI(i,m,n,k) for ( int i = m; i >= n; i -= k ) #define READ(f) freopen(f, "r", stdin) #define WRITE(f) freopen(f, "w", stdout) using namespace std; const double pi = acos(-1); const double eps = 1e-10; const int dir[4][2] = { 1,0, -1,0, 0,1, 0,-1 }; struct node{ int x, y, cnt; node(){} node( int _x, int _y ) : x(_x), y(_y) {} node( int _x, int _y, int _cnt ) : x(_x), y(_y), cnt(_cnt) {} }; struct Trie{ int next[500010][30]; int fail[500010]; int end[500010]; int root, L; int newnode(){ for ( int i = 0; i < 26; i ++ ){ next[L][i] = -1; } end[L++] = 0; return L - 1; } void init(){ L = 0; root = newnode(); } void insert( char buf[] ){ int len = strlen ( buf ); int now = root; for ( int i = 0; i < len; i ++ ){ if ( next[now][buf[i]-'a'] == -1 ) next[now][buf[i]-'a'] = newnode(); now = next[now][buf[i]-'a']; } end[now] ++; } void build(){ queue<int> Q; fail[root] = root; for ( int i = 0; i < 26; i ++ ){ if ( next[root][i] == -1 ){ next[root][i] = root; } else{ fail[next[root][i]] = root; Q.push ( next[root][i] ); } } while ( ! Q.empty() ){ int now = Q.front(); Q.pop(); for ( int i = 0; i < 26; i ++ ){ if ( next[now][i] == -1 ){ next[now][i] = next[fail[now]][i]; } else{ fail[next[now][i]] = next[fail[now]][i]; Q.push ( next[now][i] ); } } } } int query ( char buf[] ){ int len = strlen ( buf ); int now = root; int res = 0; for ( int i = 0; i < len; i ++ ){ now = next[now][buf[i]-'a']; int temp = now; while ( temp != root ){ res += end[temp]; end[temp] = 0; temp = fail[temp]; } } return res; } }; char buf[1000010]; Trie ac; int main() { int T; int n; RDI ( T ); while ( T -- ){ RDI ( n ); ac.init(); for ( int i = 0; i < n; i ++ ){ RS ( buf ); ac.insert ( buf ); } ac.build(); RS ( buf ); PIL ( ac.query(buf) ); } return 0; }
相关文章推荐
- HDOJ 2222 Keywords Search
- hdoj 2222 Keywords Search
- AC自动机 HDOJ 2222 Keywords Search
- ACM HDOJ 2222 (Keywords Search)
- HDOJ 2222: Keywords Search
- 【AC自动机】 HDOJ 2222 Keywords Search
- HDOJ---2222 Keywords Search[ac自动机模版题]
- HDOJ 2222.Keywords Search(AC自动机模板)
- [HDOJ2222]Keywords Search
- HDOJ 2222 Keywords Search
- 【HDOJ】2222 Keywords Search
- HDOJ 2222 Keywords Search
- 【AC自动机】【HDOJ2222】 Keywords Search
- HDOJ 2222 Keywords Search (AC自动机)
- HDU 2222 Keywords Search
- 【AC自动机】HDU-2222 Keywords Search
- hdoj-2222 Keywords Search(AC自动机)
- HDU 2222 Keywords Search
- { AC自动机 }hdoj2222
- HDU 2222 Keywords Search