裸的AC自動機。。。。測模板。。。。
3 AA BB CC ooxxCC%dAAAoen....END
AA: 2 CC: 1 Hint Hit: 題目描述中沒有被提及的所有情況都應該進行考慮。比如兩個病毒特征碼可能有相互包含或者有重疊的特征碼段。 計數策略也可一定程度上從Sample中推測。
#include#include #include #include #include using namespace std; const int maxn=110000; char str[2000200],word[1200][55]; int ch[maxn][26],fail[maxn],ed[maxn],nb[1200]; int Size,root; int idx(char x) { if(x>='A'&&x<='Z')return x-'A'; return -999; } int newnode() { memset(ch[Size],-1,sizeof(ch[Size])); ed[Size++]=0; return Size-1; } void ac_init() { Size=0; root=newnode(); memset(nb,0,sizeof(nb)); } void ac_insert(char str[],int ck) { int len=strlen(str); int now=root; for(int i=0;i q; fail[root]=root; for(int i=0;i<26;i++) { if(ch[root][i]==-1) ch[root][i]=root; else { fail[ch[root][i]]=root; q.push(ch[root][i]); } } while(!q.empty()) { int now=q.front(); q.pop(); for(int i=0;i<26;i++) { if(ch[now][i]==-1) ch[now][i]=ch[fail[now]][i]; else { fail[ch[now][i]]=ch[fail[now]][i]; q.push(ch[now][i]); } } } } void ac_query(char str[]) { int len=strlen(str); int now=root; int ret=0; for(int i=0;i