http://www.lydsy.com/JudgeOnline/problem.php?id=2754 (题目链接)

题意

  给出$n$个名字串,$m$个点名串,问对于每一个姓名串,它包含多少个点名串,并且每一个点名串串是多少姓名串的子串。

Solution

  暴力踩正解,乱搞能AC。暴跳fail即可

  网上终于找到了正解:http://blog.csdn.net/clover_hxy/article/details/52502544,然而不想写了。。

  

  UPD:自己脑补了一个后缀数组的做法。首先跟网上大部分后缀数组暴力的做法一样,点名串和姓名串接起来求SA。对于一个点名串长度为$len$,包含它的姓名串与它的lcp长度一定正好等于$len$。因为排好了序的后缀数组中,lcp只会随着距离的增大而减小,所以满足条件的姓名串的后缀一定是一个区间。这里最暴力的方法就是对于每一个姓名串往两边for(虽然可以AC= =),我们用ST表维护一下任意两个后缀的lcp,然后倍增求出这个区间,复杂度$O(m\log n)$

  接下来问题就转化为了:给出了一个$n$个数的序列,一共$m$个区间,问每个区间覆盖了多少个不同的数(点名串是多少姓名串的子串),每个值被多少个区间覆盖(姓名串包含多少个点名串)。两问都没有修改所以很好做。可以$O(n\sqrt{n})$的莫队艹过去,或者第一问就主席树,第二问线段树$O(n\log n)$。

  所以,你还想写吗= =,三个namespace,fuck!

细节

  buildfail时记得入队。不忽略行末空格是smg。。

代码

// bzoj2754
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
#define LL long long
#define inf (1ll<<30)
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout)
using namespace std; const int maxn=100010;
int n,m,a[maxn],vis[maxn],res[maxn],ans[maxn];
vector<int> v[maxn][2];
struct node {
map<int,int> mp;
vector<int> end;
int next,cnt;
int& operator [] (int x) {return mp[x];}
}tr[maxn]; namespace ACM {
int head[maxn],cnt,sz=1;
struct edge {int to,next,w;}e[maxn];
void link(int u,int v,int w) {
e[++cnt]=(edge){v,head[u],w};head[u]=cnt;
}
void insert(int *r,int len,int id) {
int p=1;
for (int i=1;i<=len;i++) {
if (!tr[p][r[i]]) {
tr[p][r[i]]=++sz;
link(p,sz,r[i]);
}
p=tr[p][r[i]];
}
tr[p].end.push_back(id);tr[p].cnt++;
}
void buildfail() {
queue<int> q;q.push(1);
tr[1].next=0;
while (!q.empty()) {
int x=q.front();q.pop();
for (int i=head[x];i;i=e[i].next) {
int k=tr[x].next,c=e[i].w;
while (!tr[k][c]) k=tr[k].next;
tr[tr[x][c]].next=tr[k][c];
q.push(tr[x][c]);
}
}
}
}
using namespace ACM; int main() {
scanf("%d%d",&n,&m);
for (int len,i=1;i<=n;i++) {
scanf("%d",&len);
for (int x,j=1;j<=len;j++) scanf("%d",&x),v[i][0].push_back(x);
scanf("%d",&len);
for (int x,j=1;j<=len;j++) scanf("%d",&x),v[i][1].push_back(x);
}
for (int i=0;i<=10000;i++) tr[0][i]=1;
for (int len,i=1;i<=m;i++) {
scanf("%d",&len);
for (int j=1;j<=len;j++) scanf("%d",&a[j]);
insert(a,len,i);
}
buildfail();
for (int i=1;i<=n;i++)
for (int t=0;t<=1;t++) {
int len=v[i][t].size(),p=1;
for (int j=0;j<len;j++) {
while (!tr[p][v[i][t][j]]) p=tr[p].next;
p=tr[p][v[i][t][j]];
for (int k=p;k;k=tr[k].next)
if (tr[k].cnt)
for (int l=0;l<tr[k].cnt;l++) {
if (vis[tr[k].end[l]]!=i) ans[tr[k].end[l]]++,res[i]++;
vis[tr[k].end[l]]=i;
}
}
}
for (int i=1;i<=m;i++) printf("%d\n",ans[i]);
for (int i=1;i<=n;i++) {
printf("%d",res[i]);
if (i<n) printf(" ");
}
return 0;
}

【bzoj2754】 SCOI2012—喵星球上的点名的更多相关文章

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

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

  2. [BZOJ2754] [SCOI2012]喵星球上的点名解题报告|后缀数组

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

  3. bzoj2754:[SCOI2012]喵星球上的点名(后缀自动机)

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

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

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

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

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

  6. BZOJ2754 SCOI2012喵星球上的点名

    绝世好题. 正当我犹豫不决时,hzwer说:“MAP!!!” 没错这题大大的暴力,生猛的stl,贼基尔爽,,ԾㅂԾ,, 由于我们求点名在名字中的子串个数,所以将点名建AC自动机,记录节点属于哪次点名, ...

  7. BZOJ2754 [SCOI2012]喵星球上的点名 SA+莫队+树状数组

    题面 戳这里 题解 首先先把所有给出的姓名和询问全部接在一起,建出\(height\)数组. 某个串要包含整个询问串,其实就相当于某个串与询问串的\(lcp\)为询问串的长度. 而两个后缀\(Suff ...

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

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

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

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

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

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

随机推荐

  1. 20155234 昝昕明《基于ARM实验箱的国密算法应用》课程设计个人报告

    20155234 昝昕明<基于ARM实验箱的国密算法应用>课程设计个人报告 个人贡献 参与课设题目讨论及完成全过程: 资料收集: SM1算法及和ARM之间通信 负责串口代码调试: 协调完成 ...

  2. VS编程,WPF单独更改TextBlock中部分文字格式的一种方法

    原文:VS编程,WPF单独更改TextBlock中部分文字格式的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/articl ...

  3. Command and Query Responsibility分离模式

    CQRS模式,就是命令和查询责任分离模式. CQRS模式通过使用不同的接口来分离读取数据和更新数据的操作.CQRS模式可以最大化性能,扩展性以及安全性,还会为系统的持续演化提供更多的弹性,防止Upda ...

  4. debian系统下改语言设置

    debian系统下改语言设置 安装debian 的时候选择了中文zh_CN_UTF-8,然后进系统后想换成en_US_UTF-8 可以使用一下命令选择:找到需要的语言 确定即可 dpkg-reconf ...

  5. servelt filter listener 的生命周期

    1. servlet    当第一次请求一个servlet资源时,servlet容器创建这个servlet实例,并调用他的 init(ServletConfig config)做一些初始化的工作,然后 ...

  6. Monkey稳定性测试

    1.环境准备:Android SDK环境配置 2.手机连接/模拟器连接 : 1)手机打开开发者模式并允许USB连接 2)校验手机是否连接:打开cmd 输入 adb devices 3.查找apk包名及 ...

  7. cocos2d-x学习之路(一)——安装cocos2d-x

    这两天想从pygame和SDL换到cocos2d-x上(主要还是为了跨平台开发),所以这里先来看看如何安装cocos2d-x. 首先到官网去下载cocos2d-x:传送门 点击上方菜单栏的Produc ...

  8. 利用Python实现App自动签到领取积分

    要自动签到,最简单的是打开页面分析请求,然后我们用脚本实现请求的自动化.但是发现食行没有页面,只有 APP,这不是一个好消息,这意味着需要抓包处理了. 有需要Python学习资料的小伙伴吗?小编整理[ ...

  9. 红黑树插入与删除完整代码(dart语言实现)

    之前分析了红黑树的删除,这里附上红黑树的完整版代码,包括查找.插入.删除等.删除后修复实现了两种算法,均比之前的更为简洁.一种是我自己的实现,代码非常简洁,行数更少:一种是Linux.Java等源码版 ...

  10. B1048 数字加密

    15/20 #include<bits/stdc++.h> using namespace std; stack<int> s; char a[3]={'J','Q','K'} ...