2754

思路:

  AC自动机暴力处理匹配;

  强大的ac自动机,强大的fail树,强大的map,强大的vector,强大的指针;

代码:

#include <map>
#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; #define maxn 80005
#define maxm 200005
#define maxlen 400005 struct TreeNodeType {
int tag,id; TreeNodeType *fail; map<int,TreeNodeType*>next; TreeNodeType()
{
tag=,id=,fail=NULL,next.clear();
}
};
struct TreeNodeType *que[maxlen],*root; int n,m,tot,ans2[maxn],ans1[maxn]; map<int,bool>vis; vector<int>name[maxn],times[maxm]; inline void in(int &now)
{
char Cget=getchar();now=;
while(Cget>''||Cget<'') Cget=getchar();
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
} int main()
{
freopen("name.in","r",stdin);
freopen("name.out","w",stdout);
root=new TreeNodeType,root->id=++tot;
in(n),in(m);int len,pos;
for(int i=;i<=n;i++)
{
in(len);
for(int j=;j<=len;j++) in(pos),name[i].push_back(pos);
name[i].push_back(-),in(len);
for(int j=;j<=len;j++) in(pos),name[i].push_back(pos);
name[i].push_back(-);
}
for(int i=;i<=m;i++)
{
in(len);TreeNodeType *now=root;
for(int j=;j<=len;j++)
{
in(pos);
if(now->next[pos]==NULL)
{
now->next[pos]=new TreeNodeType;
now->next[pos]->id=++tot;
}
now=now->next[pos];
}
now->tag++,times[now->id].push_back(i);
}
int h=,tail=;que[h]=root;
while(h<tail)
{
TreeNodeType *now=que[h++],*temp=NULL;
for(map<int,TreeNodeType*>::iterator it=now->next.begin();it!=now->next.end();it++)
{
if(now==root) it->second->fail=root;
else
{
temp=now->fail;
while(temp!=NULL)
{
if(temp->next[it->first])
{
it->second->fail=temp->next[it->first];
break;
}
temp=temp->fail;
}
if(temp==NULL) it->second->fail=root;
}
que[tail++]=it->second;
}
}
for(int i=;i<=n;i++)
{
len=name[i].size(),vis.clear();
TreeNodeType *now=root,*temp;
for(int j=;j<len;j++)
{
if(!vis[now->id])
{
vis[now->id]=true;
if(now->tag)
{
ans2[i]+=now->tag;
for(int v=;v<times[now->id].size();v++) ans1[times[now->id][v]]++;
}
TreeNodeType *temp=now->fail;
while(temp!=NULL)
{
if(!vis[temp->id])
{
vis[temp->id]=true;
if(temp->tag)
{
ans2[i]+=temp->tag;
for(int v=;v<times[temp->id].size();v++) ans1[times[temp->id][v]]++;
}
}
temp=temp->fail;
}
}
if(now->next[name[i][j]]) now=now->next[name[i][j]];
else
{
temp=now->fail;
while(temp!=NULL)
{
if(!vis[temp->id])
{
vis[temp->id]=true;
if(temp->tag)
{
ans2[i]+=temp->tag;
for(int v=;v<times[temp->id].size();v++) ans1[times[temp->id][v]]++;
}
}
if(temp->next[name[i][j]])
{
now=temp->next[name[i][j]];
TreeNodeType *pos=temp->fail;
while(pos!=NULL)
{
if(!vis[pos->id])
{
vis[pos->id]=true;
if(pos->tag)
{
ans2[i]+=pos->tag;
for(int v=;v<times[pos->id].size();v++) ans1[times[pos->id][v]]++;
}
}
pos=pos->fail;
}
break;
}
temp=temp->fail;
}
if(temp==NULL) now=root;
}
}
}
for(int i=;i<=m;i++) printf("%d\n",ans1[i]);
for(int i=;i<=n;i++)
{
if(i==) printf("%d",ans2[i]);
else printf(" %d",ans2[i]);
}
return ;
}

AC日记——[SCOI2012]喵星球上的点名 bzoj 2754的更多相关文章

  1. BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1902  Solved: 837[Submit][St ...

  2. BZOJ 2754: [SCOI2012]喵星球上的点名

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 649  Solved: 305[Submit][Sta ...

  3. BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1906  Solved: 839[Submit][St ...

  4. 【BZOJ2754】[SCOI2012]喵星球上的点名

    [BZOJ2754][SCOI2012]喵星球上的点名 题面 bzoj 洛谷 题解 这题有各种神仙做法啊,什么暴力\(AC\)自动机.\(SAM\)等等五花八门 我这个蒟蒻在这里提供一种复杂度正确且常 ...

  5. BZOJ2754: [SCOI2012]喵星球上的点名

    2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 680  Solved: 314[Submit][Sta ...

  6. P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)

    P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...

  7. 洛咕 P2336 [SCOI2012]喵星球上的点名

    洛咕 P2336 [SCOI2012]喵星球上的点名 先求出SA和height,一个点名串对应的就是一段区间,还有很多个点,就转化成了 有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个 ...

  8. 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告

    P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...

  9. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机)

    Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2816  Solved: 1246[Submit][Status][Discuss] Descript ...

随机推荐

  1. tomcat 启动报错 解决办法 A child container failed during

    控制台报错: Caused by: org.apache.catalina.LifecycleException: A child container failed during start at o ...

  2. 算法(11)Find All Duplicates in an Array

    题目:数组的长度是n,里面的数是1到n,其中肯定有重复的,找到里面重复的数字 思路:自己想愣是没有想出来,直接看答案,关键点是看nums[i]和nums[nums[i]-1]之间的关系,遍历整个数组, ...

  3. 【bzoj1922】[Sdoi2010]大陆争霸 堆优化Dijkstra

    题目描述 一张n个点m条边的图,通过每条边需要一定的时间.有一些限制条件,每个限制条件形如“x保护y”,表示到达y的最短时间不能小于到达x的最短时间(即如果在其之前到达,则需要等待至xd到达).问1到 ...

  4. BZOJ5322 [Jxoi2018]排序问题 【贪心】

    题目链接 BZOJ5322 题解 意思就是使有序的排列尽量少 就是使相同的数尽量少 然后大力贪心即可 #include<algorithm> #include<iostream> ...

  5. BZOJ3132 上帝造题的七分钟 【二维树状数组】

    题目 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的 ...

  6. JQuery队列queue与原生模仿其实现

    jQuery中的queue和dequeue是一组很有用的方法,他们对于一系列需要按次序运行的函数特别有用.特别animate动画,ajax,以及timeout等需要一定时间的函数. queue() 方 ...

  7. Spring学习--依赖注入的方式

    Spring 依赖注入: 属性注入(最常使用) 构造函数注入 工厂方法注入(很少使用,不推荐) 属性注入:通过 setter 方法注入 Bean 的属性值或依赖的对象 , 使用<property ...

  8. AMD 和 CMD的区别

    AMD 是 RequireJS 在推广过程中对模块定义的规范化产出.CMD 是 SeaJS 在推广过程中对模块定义的规范化产出.类似的还有 CommonJS Modules/2.0 规范,是 Brav ...

  9. xml数据格式

    <?xml version="1.0" encoding="utf-8"?> <country> <name>中国</ ...

  10. poj1379 Run Away

    传送门:http://poj.org/problem?id=1379 [题解] 题目大意:求(0,0)->(X,Y)内的一个点,使得这个点到给定的n个点的最小距离最大. 模拟退火 一开始可以先把 ...