「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,一个点名串对应的就是一段区间,还有很多个点,就转化成了 有很多个区间,很多个点集,对每个区间计算和多少个点集有交,对每个 ...
随机推荐
- 【Python】数据结构
列表的更多特性 list.append(x) 在列表的末尾添加一个元素.相当于 a[len(a):] = [x] . list.extend(iterable) 使用可迭代对象中的所有元素来扩展列表. ...
- 00 在Windows环境中开发Cordova项目的准备工作
1.开发环境准备: 安装nodejs 安装Cordova 安装Visual Studio Code 安装nodejs步骤: 通过nodejs官网(https:/ ...
- 044 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 06 使用do-while循环实现猜字游戏
044 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 06 使用do-while循环实现猜字游戏 本文知识点:do-while循环深入运用 案例练习 案例 ...
- 005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介
005 01 Android 零基础入门 01 Java基础语法 01 Java初识 05 Eclipse简介 Eclipse是一款集成开发工具--IDE. 集成开发环境(IDE,Integrated ...
- Arduino 模拟引脚
Arduino的模拟引脚的引用,网上不错的一篇文章 参考:http://blog.sina.com.cn/s/blog_156e62ef90102xjio.html 模拟引脚 本文是对于Arduino ...
- matlab中fopen 打开文件或获得有关打开文件的信息
参考:https://ww2.mathworks.cn/help/matlab/ref/fopen.html?searchHighlight=fopen&s_tid=doc_srchtitle ...
- 【题解】[USACO08MAR]Land Acquisition G
Link 题目大意:给定\(n\)个二元组,每次可以选择一组,花费是组内最大的长乘以最大的宽.问消掉所有二元组的最小代价. \(\text{Solution:}\) \(dp\)写的不够啊-- 先挖掘 ...
- Tensorflow学习笔记No.4.2
使用CNN卷积神经网络(2) 使用Tensorflow搭建简单的CNN卷积神经网络对fashion_mnist数据集进行分类 不了解是那么是CNN卷积神经网络的小伙伴可以参考上一篇博客(Tensorf ...
- .net core中的那些常用的日志框架(NLog篇)
前言 咱们上回讲到,.net core中内置的Logging日志框架的使用,以及浅显的讲解,接下来,给大家介绍一个第三方日志框架(NLog). NLog简介 NLog是适用于各种.NET平台(包括.N ...
- 使用git 版本控制的代码在线修调试,如何还原
在线调试: 先切换成www用户进入项目的根目录比如/data/wwwroot/website su www cd /data/wwwroot/website vi ./api/controllers/ ...