【前言】
本来是用来愉悦身心的题目,结果因为自己一些zz错误弄得很不愉悦。

【题目】
51Nod
给定一棵Trie\text{Trie}Trie(实际上是给出字符串自己建),QQQ次询问Trie\text{Trie}Trie上等于(x,y)(x,y)(x,y)的字符串(s,t)(s,t)(s,t)有多少个。其中二元组前一个是后一个的祖先。
Q≤105Q\leq 10^5Q≤105,给出字符串总长≤106\leq 10^6≤106

【解题思路】
这个题就是SAM\text{SAM}SAM的基本操作辣。

通用套路:我们建出Trie\text{Trie}Trie及其广义SAM\text{SAM}SAM然后线段树合并得到right\text{right}right集合,那么一个对于一个字符串来说其答案就是对应节点right\text{right}right集合的大小。但是这个题由于只用查总的大小而不是一段区间内的大小,因此我们直接记一个szszsz就可以了。

定位节点的话就是先找到询问的ttt对应节点,然后倍增往上跳到mxmxmx不小于询问长度的最上的节点即是对应节点。

复杂度O((Q+n)log⁡n)O((Q+n)\log n)O((Q+n)logn)

【参考代码】

#include<bits/stdc++.h>
#define pb push_back
using namespace std;const int N=1e6+5,M=N*2;
int ls[N];
vector<int>vec[N/10+5];namespace IO
{int read(){int ret=0;char c=getchar();while(!isdigit(c)) c=getchar();while(isdigit(c)) ret=ret*10+(c^48),c=getchar();return ret;}void write(int x){if(x>9)write(x/10);putchar(x%10^48);}void writeln(int x){write(x);putchar('\n');}
}
using namespace IO;namespace String
{int b[M],c[M];struct SAM{int sz,las;int fa[M],mx[M],siz[M],ch[M][26],bz[21][M];void init(){ls[0]=las=sz=1;}int extend(int x){int p,q,np,nq;if(ch[las][x]){p=las;q=ch[p][x];if(mx[q]==mx[p]+1) return (las=q);nq=++sz;mx[nq]=mx[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));fa[nq]=fa[q];fa[q]=nq;for(;p && ch[p][x]==q;p=fa[p]) ch[p][x]=nq;return (las=nq);}p=las;las=np=++sz;mx[np]=mx[p]+1;for(;p && !ch[p][x];p=fa[p]) ch[p][x]=np;if(!p) fa[np]=1;else{q=ch[p][x];if(mx[q]==mx[p]+1) fa[np]=q;else{nq=++sz;mx[nq]=mx[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q]));fa[nq]=fa[q];fa[np]=fa[q]=nq;for(;p && ch[p][x]==q;p=fa[p]) ch[p][x]=nq;}}return las;}void merge(){for(int i=1;i<=sz;++i) b[mx[i]]++;for(int i=1;i<=sz;++i) b[i]+=b[i-1];for(int i=sz;i;--i) c[b[mx[i]]--]=i;for(int i=sz,x;i;--i) x=c[i],siz[fa[x]]+=siz[x];for(int i=1;i<=sz;++i) {int x=c[i];bz[0][x]=fa[x];for(int j=1;j<=20;++j) bz[j][x]=bz[j-1][bz[j-1][x]];}}}S;struct Trie{int sz,ch[N][26];void init(){sz=0;}void insert(char *s,int n,int id){int now=0;vec[id].pb(0);for(int i=1;i<=n;++i){int x=s[i]-'a';if(!ch[now][x]) ch[now][x]=++sz,S.las=ls[sz]=ls[now],S.extend(x),ls[sz]=S.las,++S.siz[S.las];now=ch[now][x];vec[id].pb(ls[now]);//printf("%d %d %d\n",x,sz,ls[now]);}}}T;
}
using namespace String;namespace DreamLolita
{int n,Q;char s[N];void solution(){n=read();S.init();T.init();for(int i=1;i<=n;++i) scanf("%s",s+1),T.insert(s,strlen(s+1),i);S.merge();Q=read();while(Q--){int d=read(),x=read(),y=read(),p=vec[d][y];for(int i=20;~i;--i) if(S.mx[S.bz[i][p]]>=y-x+1) p=S.bz[i][p];printf("%d\n",S.siz[p]);}}
}int main()
{#ifndef ONLINE_JUDGEfreopen("51Nod1647.in","r",stdin);freopen("51Nod1647.out","w",stdout);
#endifDreamLolita::solution();return 0;
}

【SAM】51Nod1647 小Z的Trie相关推荐

  1. P1494 小Z的袜子

    P1494 小Z的袜子 莫队板子题,对询问进行排序+分块,从而得到巧妙的复杂度 对于L,R的询问. 设其中颜色为x,y,z的袜子的个数为a,b,c... 那么答案即为 (a*(a-1)/2+b*(b- ...

  2. 【0521模拟赛】小Z爱划水

    题目描述 小Z和其它机房同学都面临一个艰难的抉择,那就是 要不要划水? 每个人都有自己的一个意见,有的人想做题,有的人想划水. 当然,每个人只能选择一个事情做.如果一个人做的事情和他想做的不同,那么他 ...

  3. 【0521模拟赛】小Z爱数学

    题目描述 小Z想求F(n,k),F(n,k)表示n的所有因数pi中,满足n/pi <= k 的和. 小Z发现还是很水,所以他决定加大难度. 求 小Z还准备了很多个询问.现在你来解决一下吧. 输入 ...

  4. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 9894  Solved: 4561 [Su ...

  5. [BZOJ 2038][2009国家集训队]小Z的袜子(hose)(莫队)

    Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...

  6. 数据结构(莫队算法):国家集训队2010 小Z的袜子

    [题目描述] 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到 ...

  7. 2038: [2009国家集训队]小Z的袜子(hose)+莫队入门

    题目链接:2038: [2009国家集训队]小Z的袜子(hose) 题目: Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再 ...

  8. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块

    分块大法好 2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2938  Solved: 13 ...

  9. CH4402 小Z的袜子(莫队)

    描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号, ...

最新文章

  1. Integer 和 int的种种比较
  2. 【转】指令周期,机器周期,时钟周期,振荡周期有什么关系
  3. [深入学习C#]利用反射给对象赋值
  4. Opencv 图片缩小尺寸原理
  5. vba 根据分辨率 调整窗口显示比例_2020 如何选择适合自己的显示器?小白选购电脑显示器必看,附各类型显示器高性价比选购指南分析...
  6. c# Linq Where 抛出异常 导致 程序崩溃
  7. VS2010 Cocos2d-x 2.2创建模板
  8. 图像分割方法及性能评价综述
  9. 一些Gym三星单刷的比赛总结
  10. VC++2010开发数字图像系统1
  11. 爬取斗鱼所有房间及直播源
  12. asp.net入门教程
  13. ZUCC计算机网络 网络层(一)
  14. GC overhead limt exceed 导致的java进程假死
  15. php的微信登录示例代码,关于微信用户注册登录实例代码汇总
  16. 【bfs】密码锁-C++
  17. 验证google webrtc服务器demo(apprtc)使用的turn/stun服务器
  18. [生存志] 第56节 李聃函谷授道德经
  19. 【学习笔记】面向对象和封装
  20. ThinkPad R400 全系列官方恢复盘及官方分区工具

热门文章

  1. 小程序-实现左右菜单联动功能
  2. return 与 return false、return turn的常见用法
  3. python-docx 标题字体设置失败如何解决?
  4. 计算机与应用在线作业答案,计算机应用基础在线作业及答案
  5. 云游戏时代:游戏主机们未来的对手,也许不再是彼此了
  6. 劳动合同法电子版(2021年的合同书,应该是目前最新版)
  7. IME输入法编程 第一章
  8. 摩托车头盔防护膜—给你不一样的安全感
  9. PTA 7-192 浪漫的表白
  10. 2022张宇考研基础30讲 第十三讲 常微分方程