传送门

解题思路:

首先在后缀树上,确定了一个节点就相当于确定了一个串,那么一个点对应的串在另外一个点对应的串产生贡献,当且仅当这个点在当前点子树内。

那么考虑一个新的点在串中对串答案的贡献在一条树链上或者反过来说,就是产生贡献的点在这个点子树内。

才知道自己写的广义后缀自动机板子是错的QAQ

考虑n非常小,贡献可以单独算,再配合BZOJ2555的启发,这道题就可以使用LCT轻松地解决了。

代码:

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define lll tr[spc].ch[0]
#define rrr tr[spc].ch[1]
#define ls ch[0]
#define rs ch[1]
typedef long long lnt;
struct trnt{
int ch[];
int fa;
int val[];
int lzt[];
bool anc;
}tr[];
struct sant{
int tranc[];
int pre;
int len;
}s[];
int n,m;
lnt sum;
int siz;
int type;
int lastans;
int pos[][];
char str[];
bool whc(int spc)
{
return tr[tr[spc].fa].rs==spc;
}
void add(int spc,int no,int v)
{
if(!spc)return ;
tr[spc].val[no]+=v;
tr[spc].lzt[no]+=v;
return ;
}
void pushdown(int spc)
{
for(int i=;i<=n;i++)
{
if(tr[spc].lzt[i])
{
add(lll,i,tr[spc].lzt[i]);
add(rrr,i,tr[spc].lzt[i]);
tr[spc].lzt[i]=;
}
}
}
void recal(int spc)
{
if(!tr[spc].anc)recal(tr[spc].fa);
pushdown(spc);
return ;
}
void rotate(int spc)
{
int f=tr[spc].fa;
bool k=whc(spc);
tr[f].ch[k]=tr[spc].ch[!k];
tr[spc].ch[!k]=f;
if(tr[f].anc)
{
tr[f].anc=false;
tr[spc].anc=true;
}else tr[tr[f].fa].ch[whc(f)]=spc;
tr[spc].fa=tr[f].fa;
tr[f].fa=spc;
tr[tr[f].ch[k]].fa=f;
return ;
}
void splay(int spc)
{
recal(spc);
while(!tr[spc].anc)
{
int f=tr[spc].fa;
if(tr[f].anc)
{
rotate(spc);
return ;
}
if(whc(spc)^whc(f))rotate(spc);
else rotate(f);
rotate(spc);
}
return ;
}
void access(int spc)
{
int lst=;
while(spc)
{
splay(spc);
tr[rrr].anc=true;
tr[lst].anc=false;
rrr=lst;
lst=spc;
spc=tr[spc].fa;
}
return ;
}
void ADD(int from,int to,int cmd)
{
recal(from);
for(int i=;i<=n;i++)
{
if(tr[from].val[i])
{
add(to,i,tr[from].val[i]*cmd);
}
}
return ;
}
void link(int x,int f)
{
access(f);
splay(f);
splay(x);
ADD(x,f,);
tr[x].fa=f;
return ;
}
void cut(int spc)
{
access(spc);
splay(spc);
int spc_=lll;
lll=tr[spc_].fa=;
tr[spc_].anc=true;
splay(spc_);
ADD(spc,spc_,-);
return ;
}
int decode(int c)
{
if(type)return (c xor lastans)%;
return c;
}
int Insert(int fin,int no,int c)
{
if(s[fin].tranc[c]&&s[s[fin].tranc[c]].len==s[fin].len+)
{
int spc=s[fin].tranc[c];
access(spc);
splay(spc);
add(spc,no,);
return spc;
}
int nwp,lsp,nwq,lsq,flag=;
nwp=++siz;tr[nwp].val[no]=;
s[nwp].len=s[fin].len+;
for(lsp=fin;lsp&&!s[lsp].tranc[c];lsp=s[lsp].pre)s[lsp].tranc[c]=nwp;
if(!lsp)
{
s[nwp].pre=;
link(nwp,);
}else{
lsq=s[lsp].tranc[c];
if(s[lsq].len==s[lsp].len+)
{
s[nwp].pre=lsq;
link(nwp,lsq);
}else{
if(s[nwp].len==s[lsp].len+)flag=;
nwq=++siz;
s[nwq]=s[lsq];
s[nwq].len=s[lsp].len+;
s[nwp].pre=s[lsq].pre=nwq;
cut(lsq);
link(nwq,s[nwq].pre);
link(nwp,nwq);
link(lsq,nwq);
while(s[lsp].tranc[c]==lsq)
{
s[lsp].tranc[c]=nwq;
lsp=s[lsp].pre;
}
}
}
sum+=s[nwp].len-s[s[nwp].pre].len;
if(flag)return nwq;
return nwp;
}
void init(void)
{
for(int i=;i<=;i++)tr[i].anc=true;
siz=;
return ;
}
int query(char *a)
{
int len=strlen(a+);
int spc=;
for(int i=;i<=len;i++)
{
int c=a[i]-'';
spc=s[spc].tranc[c];
if(!spc)return ;
}
int ans=-;
recal(spc);
for(int i=;i<=n;i++)
ans=std::max(ans,tr[spc].val[i]);
return ans;
}
int main()
{
scanf("%d%d",&n,&type);
init();
for(int i=;i<=n;i++)
{
scanf("%s",str+);
int len=strlen(str+);
pos[i][]=;
for(int j=;j<=len;j++)
pos[i][]=Insert(pos[i][],i,str[j]-'');
}
scanf("%d",&m);
for(int r=;r<=m;r++)
{
for(int i=;i<=n;i++)pos[i][r]=pos[i][r-];
int opt;
scanf("%d",&opt);
if(opt==)
{
int x,y;
scanf("%d%d",&x,&y);
y=decode(y);
pos[x][r]=Insert(pos[x][r],x,y);
}
if(opt==)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
int spc=pos[x][y];
recal(spc);
lastans=tr[spc].val[z];
printf("%d\n",lastans);
}
if(opt==)printf("%lld\n",sum);
if(opt==)
{
scanf("%s",str+);
lastans=query(str);
printf("%d\n",lastans);
}
}
return ;
}

BZOJ5408: string(广义后缀自动机,LCT)的更多相关文章

  1. 2020牛客暑期多校训练营(第四场) C - Count New String (字符串,广义后缀自动机,序列自动机)

    Count New String 题意: 定义字符串函数 \(f(S,x,y)(1\le x\le y\le n)\),返回一个长度为y-x+1的字符串,第 i 位是 \(max_{i=x...x+k ...

  2. BZOJ 3277 串 (广义后缀自动机)

    3277: 串 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 309 Solved: 118 [Submit][Status][Discuss] De ...

  3. BZOJ 3473: 字符串 [广义后缀自动机]

    3473: 字符串 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 354  Solved: 160[Submit][Status][Discuss] ...

  4. cf666E. Forensic Examination(广义后缀自动机 线段树合并)

    题意 题目链接 Sol 神仙题Orz 后缀自动机 + 线段树合并 首先对所有的\(t_i\)建个广义后缀自动机,这样可以得到所有子串信息. 考虑把询问离线,然后把\(S\)拿到自动机上跑,同时维护一下 ...

  5. SP8093 JZPGYZ - Sevenk Love Oimaster(广义后缀自动机)

    题意 题目链接 Sol 广义后缀自动机板子题..和BZOJ串那个题很像 首先建出询问串的SAM,然后统计一下每个节点被多少个串包含 最后直接拿询问串上去跑就行了 #include<bits/st ...

  6. BZOJ 3473: 字符串 (广义后缀自动机)

    /* 广义后缀自动机, 每次加入维护 该right集合的set, 然后可以更新所有的parent,最终能够出现在k个串中right集合也就是set大小大于等于k的部分 这样的话就给了我们要跳的节点加了 ...

  7. bzoj 3277 串 && bzoj 3473 字符串 && bzoj 2780 [Spoj]8093 Sevenk Love Oimaster——广义后缀自动机

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

  8. 【BZOJ2780】Sevenk Love Oimaster【广义后缀自动机】

    题意 给出你n个字符串和q个查询,每个查询给出一个字符串s,对于每个查询你都要输出这个字符串s在上面多少个字符串中出现过. 分析 广义后缀自动机的裸题.建好SAM以后再跑一遍得到每个状态的ocu和la ...

  9. 【BZOJ3227】串【广义后缀自动机】

    题意 给出n个字符串,问每个字符串中有多少子串是这所有的n个字符串中至少k个的子串. 分析 广义后缀自动机模板题.对这n个串建广义后缀自动机,对于每个状态维护两个值cou[u]和lcu[u]分别代表拥 ...

随机推荐

  1. 第九章 TCP和UDP同一时候用复用一个port实现一个回射server

    #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include &l ...

  2. 插入排序、冒泡排序、选择排序、希尔排序、高速排序、归并排序、堆排序和LST基数排序——C++实现

    首先是算法实现文件Sort.h.代码例如以下: <pre name="code" class="java">/* * 实现了八个经常使用的排序算法: ...

  3. JAVA学习第二十七课(多线程(六))- 多生产者多消费者问题(JDK1.5新特性)

    多生产者多消费者问题 以生产馒头 消费馒头为例. class Resource { private String name; private int count = 1; private boolea ...

  4. Hadoop2.6.0配置參数查看小工具

    前言 使用Hadoop进行离线分析或者数据挖掘的project师,常常会须要对Hadoop集群或者mapreduce作业进行性能调优. 或许你知道通过浏览器訪问http://master:18088/ ...

  5. Session、Cookie总结

    什么是sessnion,session存在哪,能存多久.怎么设置他的存储时间 一.什么是session 1.session 被翻译为会话.当client(一般都是浏览器作为client)訪问serve ...

  6. 英语影视台词---六、Saving Private Ryan Quotes

    英语影视台词---六.Saving Private Ryan Quotes 一.总结 一句话总结: Saving Private Ryan is a 1998 American epic war fi ...

  7. PostgreSQL Replication之第六章 监控您的设置(1)

    在本书的前几章,您已经学习了各种复制以及如何配额制各种类型的场景.现在是时候通过增加监控来让您的设置更加可靠了. 在本章中,您将学习监控什么以及如恶化实施合理的监控车辆.您将学习: • 检查您的 XL ...

  8. 6、json支持

    package main import ( "encoding/json" "fmt") // Json 支持 type Response1 struct{ P ...

  9. Linux安装多功能词典GoldenDict

    Linux安装多功能词典GoldenDict 活腿肠 2017.08.01 20:52* 字数 671 阅读 1555评论 0喜欢 2 Goldendict 简介 GoldenDict是一种开源的辞典 ...

  10. [BJOI2014]大融合 LCT维护子树信息

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...