2754: [SCOI2012]喵星球上的点名 AC自动机+map
2016-02-23 21:28
197 查看
AC自动机上暴力跑匹配就好,字符集比较大用map。
#include<iostream> #include<cstdio> #include<map> #include<vector> #include<cstring> #define N 100005 using namespace std; int n,m,cnt; int ans1 ,ans2 ; bool vis ,mark[N>>1]; int p ,q ; vector<int> a[N>>2],s ,V,M; map<int,int> mp ; inline int read() { int a=0,f=1; char c=getchar(); while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();} while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();} return a*f; } inline void insert(int id) { int L=read(),x; int now=1; while (L--) { x=read(); if (!mp[now][x]) mp[now][x]=++cnt; now=mp[now][x]; } s[now].push_back(id); } inline void build_fail() { int t=0,w=1,x; q[1]=1; while (t<w) { x=q[++t]; map<int,int>::iterator it; for (it=mp[x].begin();it!=mp[x].end();it++) { int t=it->first,k=p[x]; while (!mp[k][t]) k=p[k]; p[it->second]=mp[k][t]; q[++w]=it->second; } } } inline void get(int id,int x) { for (int i=x;i;i=p[x]) if (!vis[i]) { vis[i]=1; V.push_back(i); for (int j=0;j<s[i].size();j++) if (!mark[s[i][j]]) { mark[s[i][j]]=1; M.push_back(s[i][j]); ans1[s[i][j]]++; ans2[id]++; } } else break; } inline void solve(int x) { int now=1; for (int i=0;i<a[x].size();i++) { int t=a[x][i]; while (!mp[now][t]) now=p[now]; now=mp[now][t]; get(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=read(); m=read(); for (int i=1;i<=n;i++) { int L=read(),x; while (L--) x=read(),a[i].push_back(x); a[i].push_back(-1); L=read(); while (L--) x=read(),a[i].push_back(x); } for (int i=-1;i<=10000;i++) mp[0][i]=1; cnt=1; for (int i=1;i<=m;i++) insert(i); build_fail(); 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%c",ans2[i],i!=n?' ':'\n'); return 0; }
相关文章推荐
- 一.项目介绍及django的MTV模式简介
- 父页面修改子页面元素
- mysql 常用操作命令
- 初学Maven
- 自定义流水布局(实现相册功能)
- 使用设计模式优化设计案例<一>
- 初探psutil
- Android Studio快捷键
- SringMvc 中操作 session 中的数据
- iOS百度地图API的使用
- 研究try catch finally return
- 并查集入门笔记
- 康托尔定理是如何证明的?
- ios不同版本下的UILabel自动换行问题
- 16年面试提问
- linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )
- 如何找出执行最慢的SQL
- 岁月划过生命线——大三下
- 【Linux学习016】facl与Linux终端
- 网络编程3---常用服务器编程模型