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. C - 最长公共子序列

    C - 最长公共子序列 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem De ...

  2. zuoyebiji

  3. Linux笔记二

    用户和组 添加一个tom用户,设置它属于users组,并添加注释信息分步完成:useradd tom usermod -g users tom usermod -c "hr tom" ...

  4. LeetCode -- Linked List Circle ii

    Question: Given a linked list, return the node where the cycle begins. If there is no cycle, return  ...

  5. 2017南开ACM校赛(网络赛) 民间题解

    orz 首先说一下这个只是民间题解,可能会有很多错误 程序还没有评测,所以可能存在问题 C题比赛的时候没想到..后来发现是个模板题,所以没有代码 希望这份题解能对读者有所启发吧... A题 直接倒序枚 ...

  6. [洛谷P3937]Changing

    题目大意:有 $n$ 盏灯环形排列,顺时针依次标号为 $1\cdots n$.初始时刻为 $0$ ,初始时刻第 $i$ 盏灯的亮灭 $a_i$, $0$ 表示灭, $1$ 表示亮.下一时刻每盏灯的亮灭 ...

  7. AdjustTokenPrivileges启用权限

    原文链接地址:http://blog.csdn.net/xbgprogrammer/article/details/7276760    我们有很多操作需要用到OpenProcess函数,而为了使程序 ...

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

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

  9. SynchronizationContext.Post方法 代替

    http://www.codeproject.com/KB/threads/SynchronizationContext.aspx看吧,不好,就将就的看下我的吧,呵呵!(没有直接翻译,不过大概的思路相 ...

  10. Java多线程-一个简单的线程,实现挂起和恢复的功能

    public class MySprite implements Runnable { /* * 线程用变量 */ private boolean running = false; private b ...