您的位置:首页 > 其它

AC自动机 [模板]

2013-05-04 11:00 399 查看
View Code

#define ROOT 0
const int MAX_NODE=100100;//stringnum*stringlen
const int CHI=26; //儿子数

struct ACtree {
int size;
int hash[300];
int val[MAX_NODE];
int fail[MAX_NODE];
int SQ[MAX_NODE];
int chd[MAX_NODE][CHI];
void get_hash() {
int i,j,k;
for(i=0;i<CHI;i++)
hash[i+'A']=i; //只有大写,小写A->a,可见字符A->32,CHI-128
}
void init() {
size=fail[0]=0;
memset(val,0,sizeof(val));
memset(chd[0],0,sizeof(chd));
}
void insert(char *str,int k) {
int i,j,id,p=ROOT;
for(i=0;str[i];i++) {
id=hash[str[i]];
if(!chd[p][id]) {
chd[p][id]=++size;
memset(chd[size],0,sizeof(chd[size]));
}
p=chd[p][id];
}
val[p]=k;
}
void build() {
int i,j,k,id,p=ROOT,r,v;
int qhead,qtail;
qhead=qtail=0;
for(i=0;i<CHI;i++) {
if(chd[p][i]) {
SQ[qtail++]=chd[p][i];
fail[chd[p][i]]=ROOT;
}
}
while(qhead!=qtail) {
r=SQ[qhead++];
for(i=0;i<CHI;i++) {
v=chd[r][i];
if(v) SQ[qtail++]=v,fail[v]=chd[fail[r]][i];
else chd[r][i]=chd[fail[r]][i];
}
}
}
void solve(char *str) {
int p=ROOT;
for(int i=0;str[i];i++) {
int id=hash[str[i]];
p=chd[p][id];
int tmp=p;
while(tmp!=ROOT) {
if(val[tmp])  //find one
tmp=fail[tmp]; //continue
}
}
} //solve
}AC;

void get_data() {
char str[100]; AC.init();
for(int i=1;i<=M;i++) {
scanf("%s",str);
AC.insert(str,i);
}
}
void solve() {
AC.build();
AC.solve();
}
int main() {
AC.get_hash();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: