您的位置:首页 > 其它

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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: