特别鸣神犇 fcwww 替我调出了无数个错误(没他的话我都快自闭了),祝大佬省选rp++

板子题,给我写了一天QAQ......

用 LCT 维护后缀树,暴力更新用 LCT 区间更新链即可

其实,在计算本职不同子串的时候很多网友算的都有点麻烦

不管实在后缀自动机,还是广义后缀自动机中,动态更新本质不同子串数量用最后新加的点更新即可,和其他点是无关的.

Code:

#include <queue>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#define setIO(s) freopen(s".in","r",stdin) ,freopen(s".out","w",stdout)
#define maxn 800000
#define N 10
#define ll long long
using namespace std;
char str[maxn];
long long cur_ans;
struct Link_Cut_Tree{int ch[maxn][2],f[maxn],tag[maxn],sta[maxn],val[maxn];int get(int x) {return ch[f[x]][1]==x; }int which(int x){ return ch[f[x]][1]==x;}int isRoot(int x){ return !(ch[f[x]][1]==x||ch[f[x]][0]==x);}int lson(int x){ return ch[x][0];}int rson(int x){return ch[x][1];}void add(int x,int delta){if(!x)return;val[x]+=delta,tag[x]+=delta;}void pushdown(int x){if(tag[x]) add(lson(x),tag[x]),add(rson(x),tag[x]),tag[x]=0;}void rotate(int x){int old=f[x],fold=f[old],which=get(x);if(!isRoot(old)) ch[fold][ch[fold][1]==old]=x;ch[old][which]=ch[x][which^1],f[ch[old][which]]=old;ch[x][which^1]=old,f[old]=x,f[x]=fold;}void splay(int x){int v=0,u=x;sta[++v]=u;while(!isRoot(u)) sta[++v]=f[u],u=f[u];while(v) pushdown(sta[v--]);u=f[u];for(int fa;(fa=f[x])!=u && x;rotate(x))if(f[fa]!=u) rotate(get(fa)==get(x)?fa:x);}void Access(int x){for(int y=0;x;y=x,x=f[x])splay(x),ch[x][1]=y;}void link(int a,int b){Access(a),splay(a),add(a,val[b]),f[b]=a;}void cut(int b){Access(b),splay(b);add(lson(b),-val[b]),f[lson(b)]=ch[b][0]=0;}
}tree;
struct SAM{int ch[maxn][10],f[maxn],dis[maxn];int tot,last;             void init(){ last=tot=1; } int ins(int c){int p=last,np=++tot; last=np; dis[np]=dis[p]+1;tree.val[np]=tree.tag[np]=1;while(p&&!ch[p][c])ch[p][c]=np,p=f[p];if(!p) f[np]=1,tree.link(1,np);else{int q=ch[p][c],nq;if(dis[q]==dis[p]+1)f[np]=q,tree.link(q,np);else{nq=++tot;dis[nq]=dis[p]+1;memcpy(ch[nq],ch[q],sizeof(ch[q])); f[nq]=f[q];tree.link(f[q],nq),tree.cut(q),tree.link(nq,q),tree.link(nq,np);f[q]=f[np]=nq;while(p&&ch[p][c]==q) ch[p][c]=nq,p=f[p];}}cur_ans+=dis[np] - dis[f[np]]; return np; }
}sam;
struct Node{int u,c; Node(int u=0,int c=0):u(u),c(c){}
};
queue<int>Q;
vector<int>mark;
vector<Node>G[maxn];
int idx[maxn];
void DFS(int u,int fa){int k=G[u].size();for(int i=0;i<k;++i){      Node j=G[u][i];if(j.u==fa) continue;        sam.last=idx[u],idx[j.u]=sam.ins(j.c);DFS(j.u,u);  }G[u].clear();
}
void build_Tree(int n,int st){       for(int i=1;i<n;++i) {     int u,v;     char c[10];       scanf("%d%d",&u,&v);scanf("%s",c);        G[u].push_back(Node(v,c[0]-'a')); G[v].push_back(Node(u,c[0]-'a'));        }       DFS(st,0);
}
int main(){//setIO("input");            int lll,n,m;  scanf("%d",&lll);sam.init(),idx[1] = 1;             scanf("%d",&n);     build_Tree(n,1); scanf("%d",&m); for(int i=1;i<=m;++i) {int opt_idx,a,b; scanf("%d",&opt_idx); if(opt_idx==1)  printf("%lld\n",cur_ans);  if(opt_idx==2) {scanf("%d%d",&a,&b);build_Tree(b,a);              }if(opt_idx==3) {   scanf("%s",str); a=strlen(str); b=1; bool flag = 0; for(int j=0;j<a;++j) { b=sam.ch[b][str[j]-'a']; if(!b)  flag = 1; } if(flag) printf("0\n");  else {                             tree.Access(b); tree.splay(b); printf("%d\n",tree.val[b]); }}}return 0;
}

  

转载于:https://www.cnblogs.com/guangheli/p/10625484.html

BZOJ4545: DQS的trie 广义后缀自动机_LCT相关推荐

  1. 【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

    [BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝 ...

  2. BZOJ3277 串 【广义后缀自动机】

    Description 字符串是oi界常考的问题.现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中 至少k个字符串的子串(注意包括本身). Input 第一行两个整数n, ...

  3. 【bzoj5084】hashit 广义后缀自动机+树链的并+STL-set

    题目描述 你有一个字符串S,一开始为空串,要求支持两种操作 在S后面加入字母C 删除S最后一个字母 问每次操作后S有多少个两两不同的连续子串 输入 一行一个字符串Q,表示对S的操作 如果第i个字母是小 ...

  4. 牛客多校4 - Count New String(序列自动机+广义后缀自动机)

    题目链接:点击查看 题目大意: 题目分析:首先观察到集集合 A 中那个套娃的表示,外层的范围是 [ x1 , y1 ] ,内层是 [ x2 , y2 ] ,而内层的定义域实际上是包含在外层的定义域内的 ...

  5. bzoj 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机)

    3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec   Memory Limit: 512 MB Submit: 1009   Solved: 596 [ Subm ...

  6. BZOJ5137lg4081(广义后缀自动机,set启发式合并)

    BZOJ5137&&lg4081(广义后缀自动机,set启发式合并) 题面 自己找去 HINT 给定多个文本串,让你查询每个文本串中有多少个本质不同的子串且这个子串只出现在当前这个文本 ...

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

    题目链接 \(Description\) 给定n个串和K,求每个串中有多少个子串是这n个串中至少K个串的子串. \(Solution\) 同上题,我们可以算出每个节点所代表的串出现在了几个串中:而且我 ...

  8. BZOJ-3473 (广义后缀自动机:拓扑 or 启发式合并)

    BZOJ-3473 (广义后缀自动机:拓扑 or 启发式合并) 题目链接 题意 nnn个字符串,询问每个字符串一共有几个子串至少出现在nnn个字符串中的kkk个 思路: 拓扑 建广义后缀自动机, dp ...

  9. BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机)

    BZOJ-2780 Sevenk Love Oimaster(广义后缀自动机) 题目链接 题意 给出n个字符串,询问m个串一共出现在几个字符串中. 题解 广义后缀自动机板子题 将n个串建在一起,每次插 ...

最新文章

  1. chrome扩展推荐:有我,你又省了一个ssh客户端 --- Secure Shell
  2. 博士申请 | 英国爱丁堡大学NLP组招收自然语言处理方向全奖博士生
  3. 微信社交小程序服务器,Day12-微信小程序实战-交友小程序-搭建服务器与上传文件到后端...
  4. [网络收集]Web.config配置文件详解
  5. 计算机网络链接的主要目标 主要功能,计算机网络课程教案‌.doc
  6. strcpy ,strncpy ,strlcpy地用法
  7. Slog57_玩转NPM之NPM_package的制作发布和使用
  8. as5300g2 nas软件功能_群晖NAS软件Qnote介绍及使用方法教程
  9. jQuery_pager.js分页
  10. NOIP模拟题——LGTB与序列
  11. 再见也是永别——告别即将消逝的雅虎邮箱
  12. u盘linux系统 隐藏文件,轻松显示U盘隐藏的文件夹绝招
  13. 【WiFi】wifi信道
  14. 几分钟了解Dreamweaver代码的自动排版以及dw代码的格式化
  15. 全网最详细的零基础动态web项目集成mybatis框架实现增删改查系统(案例+源码)
  16. 人生就像一张茶几,摆满了各种杯具/洗具/餐具!
  17. wannier插值能带拟合4
  18. 国企工资1万辞职去1.5万月薪私企,不想“内卷”,过来人:请三思
  19. 三、实现LED花样流水
  20. 走亲访友不慌!手把手教你怎样用Mask R-CNN和Python做一个抢车位神器

热门文章

  1. 【转】Linux下gcc编译生成动态链接库*.so文件并调用它
  2. Unexpected exception 'Cannot run program '的解决
  3. SRM 587 Div II L3:ThreeColorabilityEasyy
  4. vs2010 学习Silverlight学习笔记(11):数据与通信之WebClient
  5. 用CLIP做多个视频任务!上交牛津提出基于Prompt将CLIP拓展到多个视频任务,在open-set场景中效果极佳!...
  6. 强化学习能挑战众多世界冠军,人类亦能利用强化学习成为冠军
  7. 基于YOLOv3 与CRNN的中文自然场景文字检测与识别
  8. 医疗设备-呼吸机-数据解析
  9. 《史无前例!编程语言python斩获最有发展第一与排行榜第三!》深入 Python 流程控制
  10. 【机器学习】机器学习从零到掌握之十二 -- 教你使用决策树预测隐形眼镜类型