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语言单元测试

    转自http://blog.csdn.net/colin719/article/details/1420583 对于敏捷开发来说,单元测试必不可少,对于Java开发来说,JUnit非常好,对于C++开 ...

  2. intelliJ idea 使用技巧&方法

    导入的项目查看svn地址:在项目上右键--subversion--relocate可以看到以前对应的svn地址. 重要的几个快捷键的使用方式: (1)       alt+insert 成员变量封装 ...

  3. RPC里面的序列化反序列化以及拆包粘包

    1.序列化(1)什么是序列化? Java的序列化是把对象转换成有序字节流的过程.以便进行网络传输或者保存到本地.(2)为什么要序列化? 当两个进程进行远程通信时,如果需要发送各种各样的数据,文本.音频 ...

  4. [CF1065A]Vasya and Chocolate

    题目大意:有$s$元,一个物品$c$元,每买$a$个就送$b$个,问一共可以买多少. 题解:全部买好,最后看可以送多少(其实是因为我这道题交错了,无聊才做的) 卡点:无 C++ Code: #incl ...

  5. python实现关联规则

    代码中Ci表示候选频繁i项集,Li表示符合条件的频繁i项集 # coding=utf-8 def createC1(dataSet): # 构建所有1项候选项集的集合 C1 = [] for tran ...

  6. [学习笔记]扩展LUCAS定理

    可以先做这个题[SDOI2010]古代猪文 此算法和LUCAS定理没有半毛钱关系. [模板]扩展卢卡斯 不保证P是质数. $C_n^m=\frac{n!}{m!(n-m)!}$ 麻烦的是分母. 如果互 ...

  7. 【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp

    打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并 ...

  8. [COGS 2089.] 平凡的测试数据 带权并查集

    差点就撸上LCT了....... 带权并查集就是在并查集的基础上稍作修改,我的用穿址实现的有人用记录原父亲来实现. #include<cstdio> #define N 300010 us ...

  9. Codeforces Round #531 (Div. 3) ABCDEF题解

    Codeforces Round #531 (Div. 3) 题目总链接:https://codeforces.com/contest/1102 A. Integer Sequence Dividin ...

  10. hive 动态分区(Dynamic Partition)异常处理

    Changing Hive Dynamic Partition Limits Symptoms: Hive enforces limits on the number of dynamic parti ...