Description 当太阳的光辉逐渐被月亮遮蔽,世界失去了光明,大地迎来最黑暗的时刻。。。。在这样的时刻,人们却异常兴奋――我们能在有生之年看到500年一遇的世界奇观,那是多么幸福的事儿啊~~ Input 第一行,一个整数N(1<=N<=500),表示病毒特征码的个数。 Output 依次按如下格式输出按网站编号从小到大输出,带病毒的网站编号和包含病毒编号,每行一个含毒网站信息。 Sample Input 3 aaa bbb ccc 2 aaabbbccc bbaacc Sample Output web 1: 1 2 3 total: 1 |
AC自动机模板题,但是之前写的数组存的超内存,这里改成链表存。
#include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; int n,m,len,ans[505],cur,tot=0; const int SIGMA_SIZE = 128; char str[205],str2[10005]; struct D { int END; D* next[SIGMA_SIZE+1]; D* fail; D* last; D() {END = 0; fail = NULL; memset(next,0,sizeof(next)); } }*root = new D(); void get_fail() { queue<D*> q; D *now = root; root->fail = root; root->last = root; //初始化队列 for(int c=1;c<=SIGMA_SIZE;c++){ if(now->next[c]) { now->next[c]->fail = root; q.push(now->next[c]); now->next[c]->last = root; } } //按BFS顺序计算失配函数 while(!q.empty()) { now = q.front(); q.pop(); //已知之前所有的fail,last,求now->next[c]的fail,last. for(int c=1;c<=SIGMA_SIZE;c++) { if(now->next[c]==NULL) continue; q.push(now->next[c]); D* tmpFail = now->fail; while(tmpFail!=root && tmpFail->next[c]==NULL) tmpFail = tmpFail->fail; if(tmpFail==root&&tmpFail->next[c]==NULL) now->next[c]->fail = root; else now->next[c]->fail = tmpFail->next[c]; now->next[c]->last = now->next[c]->fail->END ? now->next[c]->fail : now->next[c]->fail->last; } } } void Find(char *str) { cur = 0; int n = strlen(str); D* now = root; for(int i=0;i<n;i++) { char c = str[i]; while(now!=root && now->next[c]==NULL) now = now->fail; now = now->next[c]; if(now==NULL) now = root; if(now->END) ans[cur++] = now->END; else if(now->last!=root) ans[cur++] = now->last->END; } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",str); len = strlen(str); D* now = root; for(int j=0;j<len;j++) { if(now->next[str[j]]==NULL) now->next[str[j]] = new D(); now = now->next[str[j]]; } now->END = i; } get_fail(); scanf("%d",&m); for(int i=1;i<=m;i++) { scanf("%s",str2); Find(str2); sort(ans,ans+cur); if(cur) { tot++; printf("web %d:",i); for(int j=0;j<cur;j++){ printf(" %d",ans[j]); } puts(""); } } printf("total: %d ",tot); }