当前位置: 首页 > news >正文

bzoj 2555 SubString——后缀自动机+LCT

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

要维护 right 集合的大小。因为 fa 会变,且 fa 构成一棵树,所以考虑用 LCT 来维护……

和平常写的 LCT 不太一样。因为要的值是原树上子树里的值,所以没有 makeroot ,splay 里不维护 splay 里的子树信息,只维护加法标记,表示 link 一下就给原树的自己到根的那条链上的所有点加了自己的值。cut 就是减掉自己的值。所以 query 或者 splay 的时候先把自己这棵 splay 里自己到根的路径 pshd 一遍,且没有 pshp 什么的。而且 link 时要区分两个点哪个是原树上的父亲。

不知怎么看出字符只有大写字母的。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1200005,K=30,M=3e6+5;
int cnt=1,lst=1,go[N][K],fa[N],l[N],mask;
int c[N][2],pre[N],sta[N],top,sm[N],tg[N];
char ch[M];
void decodeWithMask(int n,int mask)
{
  for(int i=0;i<n;i++)
    {
      mask=(mask*131+i)%n;
      swap(ch[i],ch[mask]);
    }
}
bool isroot(int x){return c[pre[x]][0]!=x&&c[pre[x]][1]!=x;}
void pshd(int x)
{
  if(!tg[x])return;int ls=c[x][0],rs=c[x][1];
  sm[ls]+=tg[x];tg[ls]+=tg[x];sm[rs]+=tg[x];tg[rs]+=tg[x];
  tg[x]=0;
}
void Pshd(int x)
{
  sta[top=1]=x;
  for(;!isroot(x);x=pre[x])sta[++top]=pre[x];
  for(int i=top;i;i--)pshd(sta[i]);
}
void rotate(int x)
{
  int y=pre[x],z=pre[y];
  if(!isroot(y))c[z][y==c[z][1]]=x;
  pre[x]=z;
  int d=(x==c[y][1]);
  pre[c[x][!d]]=y; pre[y]=x;
  c[y][d]=c[x][!d]; c[x][!d]=y;
}
void splay(int x)
{
  Pshd(x);
  while(!isroot(x))
    {
      int y=pre[x],z=pre[y];
      if(!isroot(y))
    {
      if((y==c[z][0])^(x==c[y][0]))rotate(x);
      else rotate(y);
    }
      rotate(x);
    }
}
void access(int x)
{
  for(int t=0;x;splay(x),c[x][1]=t,t=x,x=pre[x]);
}
void link(int x,int y)
{
  pre[y]=x;access(x);splay(x);
  sm[x]+=sm[y]; tg[x]+=sm[y];//tg:pre of x all added
}
void cut(int x)
{
  access(x);splay(x);
  sm[c[x][0]]-=sm[x]; tg[c[x][0]]-=sm[x];//tg:pre of x all declined
  pre[c[x][0]]=0; c[x][0]=0;
}
void add(int w)
{
  int p=lst,np=++cnt;lst=np;l[np]=l[p]+1;sm[np]=1;
  for(;p&&!go[p][w];p=fa[p])go[p][w]=np;
  if(!p)fa[np]=1,link(1,np);
  else
    {
      int q=go[p][w];
      if(l[q]==l[p]+1)fa[np]=q,link(q,np);
      else
    {
      int nq=++cnt;l[nq]=l[p]+1;
      cut(q);link(fa[q],nq);link(nq,q);link(nq,np);///
      fa[nq]=fa[q];fa[q]=nq;fa[np]=nq;//after link&cut !
      memcpy(go[nq],go[q],sizeof go[q]);
      for(;go[p][w]==q;p=fa[p])go[p][w]=nq;
    }
    }
}
int query(int len)
{
  int cr=1;
  for(int i=0;i<len;i++)
    {
      if(!go[cr][ch[i]-'A'+1])return 0;
      cr=go[cr][ch[i]-'A'+1];
    }
  Pshd(cr); return sm[cr];
}
int main()
{
  int Q;scanf("%d",&Q);scanf("%s",ch);
  int n=strlen(ch);for(int i=0;i<n;i++)add(ch[i]-'A'+1);
  char tch[10];
  while(Q--)
    {
      scanf("%s",tch);scanf("%s",ch);n=strlen(ch);
      decodeWithMask(n,mask);
      if(tch[0]=='A')
    {
      for(int i=0;i<n;i++)add(ch[i]-'A'+1);
    }
      else
    {
      int d=query(n);printf("%d\n",d);
      mask^=d;
    }
    }
  return 0;
}

 

转载于:https://www.cnblogs.com/Narh/p/10107574.html

相关文章:

  • BZOJ3238 [Ahoi2013]差异
  • 使用Java代码自定义Ribbon配置
  • CephFS 文件系统应用
  • 第二冲刺阶段第十三天
  • 近似推断---期望传播
  • 联合国儿童基金会投资六家区块链初创企业,目标是解决“全球性挑战”
  • MaxCompute新功能发布
  • 127.0.0.1 和 0.0.0.0 地址的区别
  • k8s环境部署及使用方式
  • Django2.0——中间件
  • 蔚来总裁秦力洪:不要贴标签说ES8不好 短期压力是做好服务
  • 菜鸟问题
  • python之dict与set实现原理之hash算法
  • onLoad onShow
  • CSS利用@font-face使用自定义字符和图标
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 5、React组件事件详解
  • ComponentOne 2017 V2版本正式发布
  • Cumulo 的 ClojureScript 模块已经成型
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Docker入门(二) - Dockerfile
  • Hibernate最全面试题
  • JavaScript服务器推送技术之 WebSocket
  • java多线程
  • js
  • Linux CTF 逆向入门
  • node 版本过低
  • QQ浏览器x5内核的兼容性问题
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • vue 个人积累(使用工具,组件)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • webpack4 一点通
  • 基于游标的分页接口实现
  • 实战|智能家居行业移动应用性能分析
  • 微服务框架lagom
  • 做一名精致的JavaScripter 01:JavaScript简介
  • ionic异常记录
  • scrapy中间件源码分析及常用中间件大全
  • 大数据全解:定义、价值及挑战
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #《AI中文版》V3 第 1 章 概述
  • #Java第九次作业--输入输出流和文件操作
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (4)(4.6) Triducer
  • (C语言)二分查找 超详细
  • (LeetCode C++)盛最多水的容器
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (剑指Offer)面试题34:丑数
  • (接口封装)
  • (九十四)函数和二维数组
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net core 3.0 linux,.NET Core 3.0 的新增功能