2754: [SCOI2012]喵星球上的点名|AC自动机
2016-03-04 20:55
447 查看
好久没写AC自动机啦..终于熟练掌握了WA自动机..最近通过率掉的异常的感人QAQ
map加AC自动机大法好!
map加AC自动机大法好!
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<vector> #include<cstdio> #include<queue> #include<cmath> #include<set> #include<map> #define N 100005 using namespace std; int sc() { int i=0,f=1;char c=getchar(); while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar(); return i*f; } vector<int>a ,st ,V,M; map<int,int>p ; int ans1 ,ans2 ; int q ,vis ,mark ,fail ; int n,m,cnt=1; void insert(int pos) { int l=sc(),x,now=1; for(int i=1;i<=l;i++) { x=sc(); if(!p[now][x])p[now][x]=++cnt; now=p[now][x]; } st[now].push_back(pos); } void Ac_machine() { fail[q[1]=1]=0; for(int l=1,r=2;l<r;l++) { int x=q[l]; for(map<int,int>::iterator i=p[x].begin();i!=p[x].end();i++) { int t=i->first,k=fail[x]; while(!p[k][t])k=fail[k]; fail[i->second]=p[k][t]; q[r++]=i->second; } } } void cal(int x,int y) { for(int i=y;i;i=fail[i]) if(!vis[i]) { vis[i]=1;V.push_back(i); for(int j=0;j<st[i].size();j++) if(!mark[st[i][j]]) { mark[st[i][j]]=1; M.push_back(st[i][j]); ans1[st[i][j]]++; ans2[x]++; } } else break; } void solve(int x) { int now=1; for(int i=0;i<a[x].size();i++) { int t=a[x][i]; while(!p[now][t])now=fail[now]; now=p[now][t]; cal(x,now); } for(int i=0;i<V.size();i++)vis[V[i]]=0; for(int i=0;i<M.size();i++)mark[M[i]]=0; V.clear();M.clear(); } int main() { n=sc(),m=sc(); for(int i=1;i<=n;i++) { int x=sc(),y; while(x--)y=sc(),a[i].push_back(y); a[i].push_back(10001);x=sc(); while(x--)y=sc(),a[i].push_back(y); } for(int i=0;i<=10001;i++) p[0][i]=1; for(int i=1;i<=m;i++) insert(i); Ac_machine(); for(int i=1;i<=n;i++) solve(i); for(int i=1;i<=m;i++) printf("%d\n",ans1[i]); for(int i=1;i<=n;i++) { printf("%d",ans2[i]); if(i!=n)printf(" "); } return 0; }
相关文章推荐
- HDU4758 AC自动机+DP (HDU4758与HDU2222)
- AC自动机-一般算法实现
- 字符串的多模式匹配
- BZOJ1030 [JSOI2007]文本生成器【AC自动机+DP】
- BZOJ2434 [Noi2011]阿狸的打字机【AC自动机+dfs序+树状数组】
- AC自动机
- HDU_2222 大部分是别人的,有的地方稍有改动,代码有不完善的地方!
- AC自动机算法
- HDU-2222 Keyword Search
- 【AC自动机】hdu2222 hdu2896 hdu3065 zoj3430 poj2778 hdu2243
- 【AC自动机】hdu2222 hdu2896 hdu3065 zoj3430 poj2778
- 两天AC自动机的学习 HDOJ2222 HDOJ 2896
- ac自动机+矩阵
- hdu2222 ac自动机。。。。
- poj3691DNA repair
- hdu2222Keywords Search
- hdu 3065 病毒侵袭持续中
- poj 2778 AC自动机+dp矩阵快速幂
- 2015湖南省队集训DAY6——B题(BZOJ4179)
- AC自动机入门