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. css3的counter的用法

    很早之前,计数器仅存在于ul,ol等元素中,如何想给其他元素增加计数,就只能通过list-style-image,或者background-image来实现.不过现在css3增加了counter属性, ...

  2. php数据缓存到文件类设计

    // 自定义缓存类 class Cache_Filesystem { // 缓存写保存 function set ($key, $data, $ttl) { //打开文件为读/写模式 $h = fop ...

  3. 处理大并发量订单处理的 KafKa部署总结

    处理大并发量订单处理的 KafKa部署总结 今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为 ...

  4. WebSocket API使用篇检测浏览器是否支持WebSocket(4)

    WebSocket API是下一代客户端-服务器的异步通信方法.前面有三篇文章已经对WebSocket有了一些介绍,这里我总结了一下.我在使用WebSockets API过程中遇到的问题. 1.检测浏 ...

  5. poj 1753 Flip Game (dfs)

    Flip Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 28805   Accepted: 12461 Descr ...

  6. [POJ1784]Huffman's Greed

    题面在这里 题意 给出一棵\(n\)个节点的二叉查找树的中序遍历中每个节点的访问次数\(p[i]\),和相邻两节点\(i\)和\(i+1\)的访问次数\(q[i]\),构造一棵二叉查找树使得\(\su ...

  7. 《软件调试的艺术》学习笔记——GDB使用技巧摘要

    <软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. ...

  8. jQuery.getJSON跨域访问的正确使用方式(史上最傻瓜式解释)

    最近花了2天时间完整的看了一遍 jQuery 的API,其中 $.getJSON(url[, data][, callback]) 方法的跨域访问解释真心看的一头雾水,大家可以从这里感受一下: htt ...

  9. HDU 5655 四边形判断

    CA Loves Stick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  10. mysql的中文乱码问题

    当向 MySQL 数据库插入一条带有中文的数据形如 insert into employee values(null,'张三','female','1995-10-08','2015-11-12',' ...