「SCOI2012」喵星球上的点名
「SCOI2012」喵星球上的点名
先咕着,扔个code跑路
code
#include<bits/stdc++.h>
#define vec vector
#define iter iterator
#define REP(i,x,y) for (int i=(x);i<=(y);++i)
#define DWN(i,x,y) for (int i=(x);i>=(y);--i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
template<class Tp>void ckmin(Tp &x,Tp y){
x=(x<y)?x:y;
}
template<class Tp>void ckmax(Tp &x,Tp y){
x=(x<y)?y:x;
}
template<class Tp>Tp read(){
Tp res=0,f_f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f_f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') res=(res<<3)+(res<<1)+(ch-'0'),ch=getchar();
return res*f_f;
}
#define iread() (read<int>())
#define lread() (read<long long>())
#define uread() (read<unsigned long long>())
const int maxn=20005;
const int maxm=50005;
const int maxz=240005;
const int INF=10007;
struct pii{
int x,y;
pii(){}
pii(int x,int y):x(x),y(y){}
bool operator<(const pii B)const{
if(x^B.x) return x<B.x;
return y<B.y;
}
};
int n,m,s[maxz],idx[maxz],len,tot[maxm];
vec<int> a[maxm];
namespace SA{
int c[maxz],rk[maxz],y[maxz],lg[maxz],id[maxz];
int sa[maxz],height[maxz],st[maxz][22];
int m,n;
inline void build_sa(){
m=INF,n=len;
REP(i,1,m) c[i]=0;
REP(i,1,n) c[rk[i]=s[i]]++;
REP(i,1,m) c[i]+=c[i-1];
DWN(i,n,1) sa[c[rk[i]]--]=i;
for (int k=1;k<=n;k<<=1){
int p=0;
REP(i,n-k+1,n) y[++p]=i;
REP(i,1,n){
if(sa[i]>k) y[++p]=sa[i]-k;
}
REP(i,1,m) c[i]=0;
REP(i,1,n) c[rk[y[i]]]++;
REP(i,1,m) c[i]+=c[i-1];
DWN(i,n,1) sa[c[rk[y[i]]]--]=y[i];
REP(i,1,n) y[i]=rk[i];
p=1,rk[sa[1]]=1;
REP(i,2,n){
int xa=(sa[i-1]+k>n)?-1:y[sa[i-1]+k];
int xb=(sa[i]+k>n)?-1:y[sa[i]+k];
rk[sa[i]]=(xa==xb&&y[sa[i]]==y[sa[i-1]])?p:++p;
}
if(p>=n) break;
m=p;
}
REP(i,1,n) id[i]=idx[sa[i]];
}
inline void build_height(){
int k=0;
n=len,height[1]=0;
REP(i,1,n){
if(rk[i]==1) continue;
if(k) k--;
int j=sa[rk[i]-1];
while(i+k<=n&&j+k<=n&&s[i+k]==s[j+k]) k++;
height[rk[i]]=k;
}
}
inline void build_LCP(){
lg[1]=0,n=len;
REP(i,2,n) lg[i]=lg[i>>1]+1,st[i][0]=height[i];
for (int j=1;(1<<j)<=n;j++){
for (int i=1;i+(1<<j)-1<=n;i++){
st[i][j]=st[i][j-1];
ckmin(st[i][j],st[i+(1<<(j-1))][j-1]);
}
}
}
inline int get_LCP(int x,int y){
if(x>y) swap(x,y);
x++;
int i=lg[y-x+1];
return min(st[x][i],st[y-(1<<i)+1][i]);
}
int lst,lcur;
inline int suffix_cmp(int x,int p){
if(lst){
int cur=get_LCP(lst,p);
if(cur>=lcur){
int i=lcur+1;
while(i<=tot[x]&&a[x][i]==s[sa[p]+i-1]) i++;
if(i-1>lcur) lst=p,lcur=i-1;
if(i==tot[x]+1) return 2;
return s[sa[p]+i-1]>a[x][i];
}
return s[sa[p]+cur]>a[x][cur+1];
}
int i=1;
while(i<=tot[x]&&a[x][i]==s[sa[p]+i-1]) i++;
lst=p,lcur=i-1;
if(i==tot[x]+1) return 2;
return s[sa[p]+i-1]>a[x][i];
}
inline pii match(int x){
pii res=pii(len+1,0);
int L=1,R=len,mid;
lst=0,lcur=0;
while(L<=R){
mid=L+R>>1;
int bnow=suffix_cmp(x,mid);
if(bnow^1) res.y=mid,L=mid+1;else R=mid-1;
}
L=1,R=len,lst=0,lcur=0;
while(L<=R){
mid=L+R>>1;
int bnow=suffix_cmp(x,mid);
if(bnow) res.x=mid,R=mid-1;else L=mid+1;
}
return res;
}
}
struct Mo{
int x,y,id,ans,idl;
}b[maxm];
inline bool cmp1(Mo x,Mo y){
if(x.idl^y.idl) return x.idl<y.idl;
return (x.idl&1)?(x.y<y.y):(x.y>y.y);
}
inline bool cmp2(Mo x,Mo y){
return x.id<y.id;
}
int buk[maxn],tp[maxn],ans[maxn],cnt,bsiz;
inline void update(int x,int k,int id){
if(k){
if(!buk[x]) tp[x]=id,cnt++;
buk[x]++;
}
else{
buk[x]--;
if(!buk[x]) ans[x]+=id-tp[x],cnt--;
}
}
int main(){
n=iread(),m=iread(),len=0;
REP(i,1,n){
int x=iread();
REP(j,1,x) s[++len]=iread(),idx[len]=i;
s[++len]=INF,x=iread();
REP(j,1,x) s[++len]=iread(),idx[len]=i;
s[++len]=INF;
}
SA::build_sa();
SA::build_height();
SA::build_LCP();
bsiz=(int)sqrt(len)+1;
REP(i,1,m){
tot[i]=iread(),a[i].push_back(0);
REP(j,1,tot[i]){
int x=iread();
a[i].push_back(x);
}
a[i].push_back(-1);
pii res=SA::match(i);
b[i].x=res.x,b[i].y=res.y,b[i].id=i;
b[i].ans=0,b[i].idl=(b[i].x-1)/bsiz+1;
}
sort(b+1,b+m+1,cmp1);
int pl=1,pr=0,mt=0;
cnt=0;
REP(i,1,m){
if(b[i].x>b[i].y) continue;
mt++;
while(pr<b[i].y) update(SA::id[++pr],1,mt);
while(pl>b[i].x) update(SA::id[--pl],1,mt);
while(pr>b[i].y) update(SA::id[pr--],0,mt);
while(pl<b[i].x) update(SA::id[pl++],0,mt);
b[i].ans=cnt;
}
REP(i,1,n){
if(!buk[i]) continue;
ans[i]+=mt-tp[i]+1;
}
sort(b+1,b+m+1,cmp2);
REP(i,1,m) printf("%d\n",b[i].ans);
REP(i,1,n){
if(i^n) printf("%d ",ans[i]);
else printf("%d\n",ans[i]);
}
return 0;
}
「SCOI2012」喵星球上的点名的更多相关文章
- BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...
- BZOJ 2754 【SCOI2012】 喵星球上的点名
题目链接:喵星球上的点名 首先可以发现姓和名两个串就是逗你玩的.在两个串中间插入一个\(10001\),当成一个串做就可以了. 于是我们的问题转化为了: 有\(n\)个串\(A_1,A_2,\dots ...
- 【bzoj2754】【scoi2012】喵星球上的点名
题解们: 1.首先可以被很多暴力给搞过去:我以前也是这样水过去的 2.ac自动机 2.1 抽离fail树 对点名建自动机,建$fail$树的时候只保留询问节点: 对于一个喵,子串==在自动机里匹配到的 ...
- BZOJ 2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 649 Solved: 305[Submit][Sta ...
- BZOJ2754: [SCOI2012]喵星球上的点名
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 680 Solved: 314[Submit][Sta ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [后缀数组+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1906 Solved: 839[Submit][St ...
- BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]
2754: [SCOI2012]喵星球上的点名 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1902 Solved: 837[Submit][St ...
- P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)
P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...
- 洛咕 P2336 [SCOI2012]喵星球上的点名
洛咕 P2336 [SCOI2012]喵星球上的点名 先求出SA和height,一个点名串对应的就是一段区间,还有很多个点,就转化成了 有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个 ...
随机推荐
- 怎样禁用UEFI boot option中的USB启动,防止U盘WIN PE系统黑入电脑?
Title: Disable all UEFI boot options tblatt 问: Hello, system: Latitude E6530 I want to disable all U ...
- IntelliJ IDEA 调试 Java 8 Stream,实在太香了!
前段时间,栈长发布了一篇关于 Java 8 Optional.map 的实用文章,留言区就有的人说 Java 8 的语法糖不方便调试,还要视情况使用. 留言区也有人说 IntelliJ IDEA 早已 ...
- 可能是东半球第二好用的软件工具全部在这里(update in 2020.10.09)
1. 产品经理工具种草 浏览器:Google Chrome 网络浏览器 原型绘制软件:墨刀- 在线产品原型设计与协作平台(https://modao.cc/).摹客mockplus - 摹客,让设计和 ...
- ✅Vue选择图像
下载 Vue选择图像Vue选择图像 Vue 2.用于从列表中选择图像的组件 演示 https://mazipan.github.io/vue-select-image/ 安装 #纱 纱添加vue-se ...
- Python中字符串有哪些常用操作?纯干货超详细
- node将js中的json对象生成到新的excel表中
第一步 安装依赖包 npm install json2xls fs 第二步 创建node.js文件,文件内代码如下: var fs = require('fs'); var path = re ...
- 多测师讲解jmeter _基本介绍_(001)高级讲师肖sir
jmeter讲课课程 一.Jmeter简介 Jmeter是由Apache公司开发的一个纯Java的开源项目,即可以用于做接口测试也可以用于做性能测试. Jmeter具备高移植性,可以实现跨平台运行. ...
- 手把手教你AspNetCore WebApi:Nginx(负载均衡)
前言 这几天小明又有烦恼了,系统上线一段时间后,系统性能出现了问题,缓存等都用上了,还是不能解决问题.马老板很大气,又买了3台服务器,让小明做个集群分流一下. 集群是什么? 是一种计算机系统,它通过一 ...
- go 协程阻塞
func main() { wg.Add(2) go test1() go test2() wg.Wait() } func test1() { defer wg.Done() for i:=0;i& ...
- MSF权限维持
MSF权限维持 环境搭建 目标机:win7 ip:192.168.224.133 攻击机:kali linux ip:192.168.224.129 首先使用web_delivery模块的regsvr ...