题面

初见广义SAM

建立广义SAM,每次把询问走一遍,最终走到节点的子树里的猫老师都被这次点名点到

这样DFS parent树打时间戳记录入栈出栈时间,把问题转化成一个序列问题:给一个若干种颜色构成的序列和一些区间,询问:

1.每个区间里有多少种颜色— —直接莫队

2.每种颜色被多少区间包含— —同样是莫队,当某种颜色消失时从它上次出现开始的区间到现在的区间都包含了它

 #include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<unordered_map>
using namespace std;
const int N=;
struct a
{
int l,r;
int idx,blo;
}q[N];
unordered_map<int,int> trs[N];
int fth[N],len[N],bel[N];
int p[N],noww[N],goal[N];
int ins[N],ots[N],col[N];
int qry[N],bkt[N],las[N],ans1[N],ans2[N];
int n,m,lp,rp,ll,rd,lst,sqr,cnt,tot,dfn,ans;
bool cmp(a x,a y)
{
return x.blo==y.blo?x.r<y.r:x.blo<y.blo;
}
void Link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
void Insert(int ch)
{
int nde=lst,newn=++tot;
lst=newn,len[newn]=len[nde]+;
while(nde&&!trs[nde][ch])
trs[nde][ch]=newn,nde=fth[nde];
if(!nde)
fth[newn]=;
else
{
int tran=trs[nde][ch];
if(len[tran]==len[nde]+)
fth[newn]=tran;
else
{
int rnde=++tot;
len[rnde]=len[nde]+,trs[rnde]=trs[tran];
fth[rnde]=fth[tran],fth[tran]=fth[newn]=rnde;
while(nde&&trs[nde][ch]==tran)
trs[nde][ch]=rnde,nde=fth[nde];
}
}
}
void DFS(int nde)
{
ins[nde]=++dfn,col[dfn]=bel[nde];
for(int i=p[nde];i;i=noww[i])
DFS(goal[i]); ots[nde]=dfn;
}
void Add(int tsk,int typ)
{
if(tsk)
if(++bkt[tsk]==)
ans++,las[tsk]=typ;
}
void Delete(int tsk,int typ)
{
if(tsk)
if(!(--bkt[tsk]))
ans--,ans2[tsk]+=typ-las[tsk];
}
int main()
{
scanf("%d%d",&n,&m),tot=;
for(int i=;i<=n;i++)
{
scanf("%d",&ll),lst=;
for(int j=;j<=ll;j++)
scanf("%d",&rd),Insert(rd),bel[lst]=i;
scanf("%d",&ll),lst=;
for(int j=;j<=ll;j++)
scanf("%d",&rd),Insert(rd),bel[lst]=i;
}
for(int i=;i<=tot;i++) Link(fth[i],i);
DFS(),sqr=sqrt(tot)+;
for(int i=;i<=m;i++)
{
scanf("%d",&ll);
for(int j=;j<=ll;j++)
scanf("%d",&qry[j]);
int nde=;
for(int j=;j<=ll;j++)
{
nde=trs[nde][qry[j]];
if(!nde) break;
}
q[i].l=ins[nde],q[i].r=ots[nde];
q[i].idx=i,q[i].blo=(q[i].l-)/sqr+;
}
sort(q+,q++m,cmp),lp=,rp=;
for(int i=;i<=m;i++)
{
while(lp<q[i].l) Delete(col[lp++],i);
while(lp>q[i].l) Add(col[--lp],i);
while(rp<q[i].r) Add(col[++rp],i);
while(rp>q[i].r) Delete(col[rp--],i);
ans1[q[i].idx]=ans;
}
for(int i=lp;i<=rp;i++) Delete(col[i],m+);
for(int i=;i<=m;i++) printf("%d\n",ans1[i]);
for(int i=;i<=n;i++) printf("%d ",ans2[i]);
return ;
}

解题:SCOI 2012 喵星球上的点名的更多相关文章

  1. BZOJ 2754 SCOI 2012 喵星球上的点名 后缀数组 树状数组

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

  2. 洛谷 P2336 [SCOI2012]喵星球上的点名 解题报告

    P2336 [SCOI2012]喵星球上的点名 题目描述 a180285 幸运地被选做了地球到喵星球的留学生.他发现喵星人在上课前的点名现象非常有趣. 假设课堂上有 \(N\) 个喵星人,每个喵星人的 ...

  3. BZOJ_2754__[SCOI2012]_喵星球上的点名_(暴力+后缀数组)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=2754 给出n个姓名串和m个点名串.求每个点名串在多少人的姓名中出现过(在名中出现或在姓中出现, ...

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

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

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

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

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

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

  7. BZOJ 2754: [SCOI2012]喵星球上的点名 [AC自动机+map+暴力]

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

  8. 【BZOJ2754】喵星球上的点名(AC自动机)

    [BZOJ2754]喵星球上的点名(AC自动机) 题面 BZOJ 题解 友情提示:此题请不要在cogs上提交,它的数据有毒 对于点名串构建\(AC\)自动机 然后把名字丢进去进行匹配, 大力统计一下答 ...

  9. P2336 [SCOI2012]喵星球上的点名(后缀自动机+莫队+dfs序)

    P2336 [SCOI2012]喵星球上的点名 名字怎么存?显然是后缀自动机辣 询问点到多少个喵喵喵其实就是 查询后缀自动机上parent树的一个子树 于是我们考虑莫队 怎么树上莫队呢 我们用dfs序 ...

随机推荐

  1. Netty源码分析第1章(Netty启动流程)---->第5节: 绑定端口

    Netty源码分析第一章:Netty启动步骤 第五节:绑定端口 上一小节我们学习了channel注册在selector的步骤, 仅仅做了注册但并没有监听事件, 事件是如何监听的呢? 我们继续跟第一小节 ...

  2. C#中字符串 "驻留"与Lock(转载)

    class TestWorker 2 {         3     public void DoMultiThreadedWork(object someParameter) 4     { 5   ...

  3. php从入门到放弃系列-03.php函数和面向对象

    php从入门到放弃系列-03.php函数和面向对象 一.函数 php真正的威力源自它的函数,内置了1000个函数,可以参考PHP 参考手册. 自定义函数: function functionName( ...

  4. python-分叉树枝

    import turtle def draw_branch(length): #绘制右侧树枝 if length >5: if length == 10: turtle.pencolor('gr ...

  5. 【探路者】Postmortem会议(“事后诸葛亮”会议)

    [探路者]Postmortem会议(“事后诸葛亮”会议) 整理:米赫 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的贪吃蛇游戏主要将完成一个 ...

  6. 对视频播放软件KMplayer的评价

    刚进入大一的时候接触到了KMplayer,由于当时收集了不同格式的电影视频却没有合适的播放器播放出来,后来在网上知道了所谓的万能播放器的KMplayer,下载用了过后,才知道这的确是一款万能播放器. ...

  7. java的第二个实验——JAVA面向对象程序设计

    java的第二个实验——JAVA面向对象程序设计 北京电子科技学院 实     验    报     告 课程:Java程序设计 班级:1352 姓名:林涵锦 学号:20135213 成绩:      ...

  8. java项目 相对路径(本项目的地址)

    File file=new File(""); String abspath=file.getAbsolutePath(); System.out.println(abspath) ...

  9. HDU 4745 Two Rabbits 区间dp_回文序列

    题目链接: http://blog.csdn.net/scnu_jiechao/article/details/11759333 Two Rabbits Time Limit: 10000/5000 ...

  10. angularJS1笔记-(5)-过滤器练习

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...