题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3881

对 S 建 SAM ,每个 T 会让 S 的 parent 树的链并答案+1;在 T 走每一步的时候,走到的节点用 LCT access 一下,就能找到该点到 parent 根的链。

给链打标记。在 access 的过程中,如果遇到已经打过这个 T 标记的点,就停止 access 。

注意实现的时候,在判断 fa[x] 有没有标记之前要先 splay(fa[x]) 。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ls c[cr][0]
#define rs c[cr][1]
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=1e5+,M=2e6+,K=;
int n,ps[N],tot=,c[M][K],tc[M][K],fl[M],q[M];
int tim,dfn[M],fa[M],vl[M],tg[M],sta[M];
char s[M];
bool isrt(int x){return c[fa[x]][]!=x&&c[fa[x]][]!=x;}
void cz(int cr)
{
if(!tg[cr])return; int w=tg[cr];tg[cr]=;
vl[ls]+=w; vl[rs]+=w;
tg[ls]+=w; tg[rs]+=w;
dfn[ls]=dfn[rs]=dfn[cr];///
}
void rotate(int x)
{
int y=fa[x],z=fa[y],d=(x==c[y][]);
if(!isrt(y))c[z][y==c[z][]]=x;
fa[x]=z; fa[y]=x; fa[c[x][!d]]=y;
c[y][d]=c[x][!d]; c[x][!d]=y;
}
void splay(int x)
{
int top; sta[top=]=x;
for(int k=x;!isrt(k);k=fa[k])sta[++top]=fa[k];
for(int i=top;i;i--)cz(sta[i]);
for(int y=fa[x],z=fa[y];!isrt(x);rotate(x),y=fa[x],z=fa[y])
if(!isrt(y))
((y==c[z][])^(x==c[y][]))?rotate(x):rotate(y);
}
void access(int x)
{
splay(x); if(dfn[x]==tim)return;
int t=;
while()
{
c[x][]=t;
if(!fa[x])
{ tg[x]++;vl[x]++;dfn[x]=tim;return;}
splay(fa[x]);//splay first
if(dfn[fa[x]]==tim)
{ tg[x]++;vl[x]++;dfn[x]=tim;return;}
t=x; x=fa[x];
}
}
void link(int x,int y){ fa[y]=x;}
int Ins()
{
int cr=,len=strlen(s+);
for(int i=;i<=len;i++)
{
int w=s[i]-'a';
if(!tc[cr][w])tc[cr][w]=++tot;
cr=tc[cr][w];
}
return cr;
}
void get_fl()
{
int he=,tl=;
for(int i=,v;i<K;i++)
if((v=tc[][i]))
{q[++tl]=v;fl[v]=;link(,v);}
else tc[][i]=;
while(he<tl)
{
int k=q[++he],pr=fl[k];
for(int i=,v;i<K;i++)
if((v=tc[k][i]))
{ q[++tl]=v;fl[v]=tc[pr][i];link(tc[pr][i],v);}
else tc[k][i]=tc[pr][i];
}
}
void solve()
{
tim++; int cr=,len=strlen(s+);
for(int i=;i<=len;i++)
{
cr=tc[cr][s[i]-'a'];
access(cr);
}
}
int main()
{
n=rdn();
for(int i=;i<=n;i++)
{ scanf("%s",s+); ps[i]=Ins();}
get_fl();
int Q=rdn(),op,x;
while(Q--)
{
op=rdn();
if(op==)
{ scanf("%s",s+); solve();}
else
{
x=rdn(); x=ps[x];
splay(x); printf("%d\n",vl[x]);
}
}
return ;
}

最新文章

  1. eclipse建立springMVC 简单项目
  2. 数据结构:链表(python版)续:带有尾节点引用的单链表
  3. HTML&amp;CSS学习总结(一)
  4. 如何准备IREB考试
  5. [] ubuntu 14.04 搜狗拼音输入法安装
  6. COJ262 HDNOIP201206施工方案
  7. javascript练习----复选框全选,全不选,反选
  8. $.extend()和$.fn.extend()用法和区别
  9. 打印出从1到最大的n位十进制数
  10. 转:Unicode字符集和多字节字符集关系
  11. [转]Delphi中,让程序只运行一次的方法
  12. fish code
  13. python_11_字符编码
  14. spark升级后 集成hbase-1.0.0-cdh5.4.5异常
  15. iOS presentViewController 方法引起的问题
  16. go mysql insert变量到数据库
  17. rgba()和opacity之间的区别(面试题)
  18. 关于封装了gevent的request grequest库的使用与讨论
  19. 2018.10.05 NOIP模拟 相遇(dfs序+lca)
  20. 表格 - bootStrap4常用CSS笔记

热门文章

  1. BZOJ 4238 电压 解题报告
  2. 【BZOJ2946&amp;SPOJ1812】公共串(后缀自动机)
  3. 51nod 1518 稳定多米诺覆盖(容斥+二项式反演+状压dp)
  4. inputAccessoryView,inputView
  5. codeforces gym 100345I Segment Transformations [想法题]
  6. vim中 E212:无法打开并写入文件 的解决办法
  7. Mycat+Pxc的配置
  8. [已解决]报错: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: &#39;/Users/mac/Ana
  9. easyUI学习笔记一
  10. 逃脱 (简单BFS)