AC自动机模板先存着,还不会...
2013-06-10 22:44
330 查看
//my first ACAutomaton # include <set> # include <map> # include <list> # include <queue> # include <stack> # include <cmath> # include <string> # include <cstdio> # include <vector> # include <cstdlib> # include <cstring> # include <iostream> # include <algorithm> using namespace std ; # define ll long long # define uint unsigned int # define ull unsigned long long # define PB push_back # define SIZE(x) (int)x.size() # define clr(x,y) memset(x,y,sizeof(x)) # define MP(x,y) make_pair(x,y) # define read(n) scanf ( "%d" , & (n) ) # define reads(n) scanf ( "%s" , n ) ; # define ALL(t) (t).begin(),(t).end() # define FOR(i,n,m) for ( int i = n ; i <= m ; i ++ ) # define IT ::iterator # define vint vector<int> # define vstring vector<string> # define code(x) (x-'a') const ll mod = 1e9+7 ; const ll LMAX = 1e18 ; const int MAX = 1e9 ; const double EPS = 1e-8; const int MAX_NODE = 500005; const int CHILD_NUM = 26; int ans; class ACAutomaton { private: int chd[MAX_NODE][CHILD_NUM]; int val[MAX_NODE]; int fail[MAX_NODE]; int sz ; public: void init() { memset(chd[0] , 0 , sizeof(chd[0])); sz = 1; } void insert(char *s,int key) { int p = 0; for ( ; *s ; s ++) { int c = code (*s); if (!chd[p][c]) { memset(chd[sz] , 0 , sizeof(chd[sz])); val[sz] = 0; chd[p][c] = sz ++; } p = chd[p][c]; } val[p] += key; //键值 } void getfail() { queue < int > q ; for (int i = 0 ; i < CHILD_NUM ; i ++) { if (chd[0][i]) { fail[ chd[0][i] ] = 0; q.push (chd[0][i]); } } while ( !q.empty() ) { int u = q.front(); q.pop(); for (int i = 0 ; i < CHILD_NUM ; i ++) { int v = chd[u][i]; if (v) { q.push (v); int tmp = fail[u]; while (tmp && !chd[tmp][i]) tmp = fail[tmp]; if (chd[tmp][i]) { tmp = chd[tmp][i]; } fail[v] = tmp; } } } } void find(char* t) { int len = strlen (t) ,p = 0; for (int i = 0 ; i < len ; i ++) { int c = code (t[i]); while (p && !chd[p][c]) { p = fail[p]; } if (chd[p][c]) { p = chd[p][c]; int tmp = p; while (tmp && val[tmp] != -1) { ans += val[tmp]; val[tmp] = -1; tmp = fail[tmp]; } } } } } ac; char s[55] ,t[1000005]; int main() { /*int T; read (T); while (T--) { ac.init(); ans = 0; int n; read (n); while (n--) { reads (s); ac.insert(s,1); } ac.getfail(); reads (t); ac.find(t); cout << ans << endl ; } */ int a,b; read(a),read(b); cout << a + b << endl ; }
相关文章推荐
- AC自动机 白书模板
- 字典树模板/ac自动机模板
- hdu 2222 ac自动机 模板
- ac自动机模板(hdu2222)
- AC自动机 模板
- C#代码生成器 如果发生重构或模板变更可以直接覆盖,在自动生成之后不会被覆盖,防止误操作?
- AC自动机模板(【CJOJ1435】)
- 杭电2896题 AC自动机模板题
- 【洛谷】3808 【模板】AC自动机(简单版)
- 逗B少年搞程序07 模板方法模式——思路可以相同,但思路不会被复制
- HDU-2222 Keywords Search (AC自动机模板)
- 算法模板——AC自动机
- [模板] - AC自动机 - 动态 - 感谢小太阳
- 【AC自动机模板】(转自木子日匀大神)
- P3808 【模板】AC自动机(简单版)
- AC自动机算法及模板
- 我的ac自动机模板
- AC自动机模板
- AC自动机 模板 hdu 2896
- HDU2222 AC自动机模板