题目大意:略

由于字符集大,要用map维护Trie树

并不能用AC自动机的Trie图优化,不然内存会炸

所以我用AC自动机暴跳fail水过的

显然根据喵星人建AC自动机是不行的,所以要根据问题建

然而这题有一些很艮的地方:

1.如果一个喵的名和姓都被点到,那他只被点到了一次

2.询问的串可能相同

3.如果map中并不包含某个元素,但你强行用数组表示它,那么它会返回0,然后这个元素会被强行插入map并赋值成0

 #include <map>
#include <queue>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define ui unsigned int
#define inf 0x3f3f3f3f
#define N 100010
#define imap map<int,int>::iterator
using namespace std;
//re
int n,m;
int a[N],len[N],l[N],r[N],qans[N],use[N],b[N];
int gint()
{
int rett=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){rett=(rett<<)+(rett<<)+c-'';c=getchar();}
return rett*fh;
}
struct Trie
{
map<int,int>ch[N];
vector<int>ed[N];
int val[N],fail[N],ans[N],tot;
void build_trie(int j)
{
int x=;
for(int i=;i<=len[j];i++){
imap k=ch[x].find(a[i]);
if(k==ch[x].end())
ch[x][a[i]]=++tot,val[tot]=a[i],x=tot;
else x=(*k).second;
if(i==len[j]) ed[x].push_back(j);
}
}
void Build()
{
for(int i=;i<=m;i++){
len[i]=gint();
for(int j=;j<=len[i];j++)
a[j]=gint();
build_trie(i);
}
}
void Fail()
{
queue<int>q;
int x=,i,j,y,z;
for(imap k=ch[].begin();k!=ch[].end();k++)
q.push((*k).second);
while(!q.empty())
{
x=q.front();q.pop();
for(imap k=ch[x].begin();k!=ch[x].end();k++)
{
i=(*k).first;
j=(*k).second;
y=fail[x];
while(!ch[y][i]&&y)
y=fail[y];
fail[j]=ch[y][i];
q.push(j);
}
}
}
void query(int p)
{
int x=;
queue<int>q;
for(int i=l[p];i<=r[p];i++)
{
while(!ch[x][b[i]]&&x)
x=fail[x];
x=ch[x][b[i]];
for(int j=x;j;j=fail[j])
if(ed[j].size()>&&!use[j]){
for(int k=;k<ed[j].size();k++)
ans[ed[j][k]]++,qans[p]++;
use[j]=,q.push(j);
}
}
x=;
for(int i=l[p+];i<=r[p+];i++)
{
while(!ch[x][b[i]]&&x)
x=fail[x];
x=ch[x][b[i]];
for(int j=x;j;j=fail[j])
if(ed[j].size()>&&!use[j]){
for(int k=;k<ed[j].size();k++)
ans[ed[j][k]]++,qans[p]++;
use[j]=,q.push(j);
}
}
while(!q.empty())
{int x=q.front();q.pop();use[x]=;}
}
}t; int main()
{
//freopen("name1.in","r",stdin);
scanf("%d%d",&n,&m);
int cnt=;
for(int i=;i<=n*;i++){
l[i]=cnt;
int num=gint();
r[i]=l[i]+num-;
for(int j=l[i];j<=r[i];j++)
b[j]=gint();
cnt=r[i]+;
}
t.Build();
t.Fail();
for(int i=;i<=n*;i+=)
t.query(i);
for(int i=;i<=m;i++)
printf("%d\n",t.ans[i]);
for(int i=;i<=n*;i+=)
printf("%d ",qans[i]);
puts("");
return ;
}

BZOJ 2754 [SCOI2012]喵星球上的点名 (AC自动机+map维护Trie树)的更多相关文章

  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]喵星球上的点名 (AC自动机、树状数组)

    吐槽: 为啥很多人用AC自动机暴力跳都过了?复杂度真的对么? 做法一: AC自动机+树状数组 姓名的问题,中间加个特殊字符连起来即可. 肯定是对点名串建AC自动机(map存儿子),然后第一问就相当于问 ...

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

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

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

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

  5. 【刷题】BZOJ 2754 [SCOI2012]喵星球上的点名

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串来点 ...

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

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

  7. BZOJ2754: [SCOI2012]喵星球上的点名(AC自动机/后缀自动机)

    Description a180285幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣.   假设课堂上有N个喵星人,每个喵星人的名字由姓和名构成.喵星球上的老师会选择M个串 ...

  8. bzoj 2754 [SCOI2012]喵星球上的点名(后缀数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2754 [题意] 每只喵有名姓,如果被老师点到名或姓的子串都要答道,但每只喵一次点名只答 ...

  9. bzoj 2754: [SCOI2012]喵星球上的点名【AC自动机】

    洛谷90,最后一个点死活卡不过去(也可能是我写的有问题? 比较暴力的做法,把询问带着标号建立AC自动机,用map存儿子. 然后用名字串在自动机上跑,以为是名或姓的子串就行所以把名和姓中间加个特殊字符拼 ...

随机推荐

  1. JSplitPane按比例分割的问题

    JSplitPane看似比Delphi的spliter难用许多.不过介于swing可以方便的使用记事本一类文本编辑器直接书写依据布局的界面代码我们还是姑且容忍它带来的不便.但在使用JSplitPane ...

  2. [模板] zkw线段树

    zkw线段树 code1简单版本 code2差分版本(暂无) code1:(有注释) //By Menteur_Hxy #include<cstdio> #include<iostr ...

  3. 【codeforces 807A】Is it rated?

    [题目链接]:http://codeforces.com/contest/807/problem/A [题意] 给你n个人在一场CF前后的rating值; 问你这场比赛是不是计分的 [题解] 如果有一 ...

  4. Java Web学习总结(27)——JavaEE中Web服务器、Web容器、Application服务器区别及联系

    在JavaEE 开发Web中,我们经常会听到Web服务器(Web Server).Web容器(Web Container).应用服务器(Application Server),等容易混淆不好理解名词. ...

  5. POJ 4786 Fibonacci Tree

    Fibonacci Tree Time Limit: 2000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ...

  6. 上机题目(0基础)- Java网络操作-Socket实现client和server端通信(Java)

    非常多刚開始学习的人对于java网络通信不太熟悉.对相关概念也不太明确,这里我们主要实现一下socket通信,socket通信在java中应用十分广泛.比如QQ和MSN等都是基于socket通信的,什 ...

  7. 【解决方法】UITableView 性能优化笔记

    1.网络图片异步载入,SDWebImage. 2.文字直接 drawInRect/drawAtPoint 绘制,參考 ABTableViewCell.AdvancedTableViewCells. 3 ...

  8. 通过PowerShell卸载全部的SharePoint 2010 解决方式

    通过PowerShell卸载全部的SharePoint 2010 解决方式         为了演示.我常常须要拆毁再重建SharePoint 2010 环境.         我常常须要用到的操作就 ...

  9. linux块设备的IO调度算法和回写机制

    ************************************************************************************** 參考: <Linux ...

  10. &lt;LeetCode OJ&gt; 100. Same Tree

    100. Same Tree Total Accepted: 100129 Total Submissions: 236623 Difficulty: Easy Given two binary tr ...