bzoj2754&JZOJ2834【SCOI2012】喵星球上的点名 AC自动机+STL
来源:互联网 发布:淘宝举报假冒伪劣 编辑:程序博客网 时间:2024/05/22 00:24
题意比较复杂,就不说了。
感觉这题目拿来恶心人的。。连输入都要花费好大功夫。表示这种题目经典套路啊,一般来说直接上AC自动机,暴力把大串往小串上贴,然后直接计算答案就行了,但是这数据大小简直了。。算了算发现离散也没用,表示不会用STL,于是去网上膜了一波做法,一脸懵逼,勉强看懂,如果考试肯定切不了这题。
听说正解是SA+主席树。
code(超丑。。):
#include<iostream>#include<set>#include<map>#include<cstdio>#include<cstring>#include<cstdlib>#include<ctime>#include<vector>#include<queue>#include<algorithm>#include<cmath>#define inf 1000000000#define pa pair<int,int>#define ll long long #define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m;const int maxn=1e5+5,maxm=2e4+5;int ans1[maxn],ans2[maxn];vector<int> a[maxm],st[maxn],V,M;map<int,int>to[maxn];bool vis[maxn],mark[3*maxm];int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}struct data{ int cnt,ans; int fail[maxn],q[maxn]; data() { cnt=1; fo(i,-1,10000) to[0][i]=1; fail[1]=0; } void insert(int id) { int L=read(),x; int now=1; fo(i,1,L) { x=read(); if (!to[now][x])to[now][x]=++cnt; now=to[now][x]; } st[now].push_back(id); } void buildfail() { int head=0,tail=1; q[0]=1; while (head!=tail) { int now=q[head++]; for(map<int,int>::iterator i=to[now].begin();i!=to[now].end();i++) { int t=i->first,k=fail[now]; while (!to[k][t])k=fail[k]; fail[i->second]=to[k][t]; q[tail++]=i->second; } } } void get(int id,int x){ for(int i=x;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[id]++; } } else break; } void solve(int x){ int now=1; for(int i=0;i<a[x].size();i++) { int t=a[x][i]; while(!to[now][t])now=fail[now]; now=to[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(); }}trie;int main(){ n=read(),m=read(); int L,x; fo(i,1,n) { L=read(); 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); } fo(i,1,m) trie.insert(i); trie.buildfail(); fo(i,1,n) trie.solve(i); fo(i,1,m)printf("%d\n",ans1[i]); fo(i,1,n) { printf("%d",ans2[i]); if (i!=n)printf(" "); } return 0;}
0 0
- bzoj2754&JZOJ2834【SCOI2012】喵星球上的点名 AC自动机+STL
- 【bzoj2754】【scoi2012】【喵星球上的点名】【AC自动机+map】
- 【bzoj2754】[SCOI2012]喵星球上的点名 AC自动机优化的暴力
- [BZOJ2754][SCOI2012]喵星球上的点名(AC自动机+fail树)
- [BZOJ2754][SCOI2012]喵星球上的点名
- [BZOJ2754][SCOI2012]喵星球上的点名
- bzoj2754【SCOI2012】喵星球上的点名
- 【BZOJ2754】【codevs2403】喵星球上的点名,AC自动机与STL的狂欢
- 2754: [SCOI2012]喵星球上的点名 AC自动机+map
- 2754: [SCOI2012]喵星球上的点名|AC自动机
- [BZOJ2754] 喵星球上的点名 - AC自动机/后缀数组/后缀自动机/玄学♂暴力
- 【BZOJ2754】【SCOI2012】喵星球上的点名 后缀数组优化暴力
- bzoj2754:[SCOI2012]喵星球上的点名 (后缀数组+离线+树状数组)
- bzoj2754 [SCOI2012]喵星球上的点名(后缀数组+暴力)
- 【SCOI2012】喵星球上的点名
- 【SCOI2012】喵星球上的点名
- 【SCOI2012】喵星球上的点名
- SCOI2012 喵星球上的点名
- 第三章 View事件体系(2)之事件分发
- linux下atime,mtime,ctime三种时间状态
- Leetcode 90 - Subsets II(Search)
- 我的科研生活2017-2-17
- POJ 3530 A Modular Arithmetic Challenge 英文少
- bzoj2754&JZOJ2834【SCOI2012】喵星球上的点名 AC自动机+STL
- apk签名冲突 与旧版不同解决办法 apk签名比对
- 怎样解决ListView条目中的Button事件
- JSP页面使用举例(单表的增删查功能实现)
- 使用Hexo搭建博客
- CHM文档打不开的问题解决方法
- 判断n 是不是素数
- 使用Fiddler抓取模拟器APP的请求,并转发到本地调试
- POJ 3531 Alternating Sum of Digits 英文少