博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1396 识别子串
阅读量:4596 次
发布时间:2019-06-09

本文共 1522 字,大约阅读时间需要 5 分钟。

题解:

首先我们知道对于size==1的点是只出现一次的

存疑:为什么新增点不会size==1

那么问题就变成区间取等差数列,区间取最小值

分别线段树维护就可以了

代码:

 

#include 
#define IL inline#define ll long long#define rint register int#define rep(i,h,t) for (rint i=h;i<=t;i++)#define dep(i,t,h) for (rint i=t;i>=h;i--)using namespace std;const int INF=1e9;const int N=3e5;char s[N];int size[N],len[N],ch[N][26];int lst=1,node=1,t[N],a[N],fa[N],pos[N],pl;void extend(int c){ int f=lst; if (ch[f][c]&&len[ch[f][c]]==len[f]+1) { lst=ch[f][c]; return; } int p=++node; lst=p; len[p]=len[f]+1; //size[p][pl]=1; while (f&&!ch[f][c]) ch[f][c]=p,f=fa[f]; if (!f) { fa[p]=1; return;}; int x=ch[f][c],y=++node; if (len[f]+1==len[x]) {fa[p]=x; node--;return;}; len[y]=len[f]+1; fa[y]=fa[x]; fa[x]=fa[p]=y; memcpy(ch[y],ch[x],sizeof(ch[x])); while (f&&ch[f][c]==x) ch[f][c]=y,f=fa[f];}IL int min(int x,int y){ if (x>y) return(y); else return(x);}IL int max(int x,int y){ if (x
y) x=y;}IL void maxn(int &x,int y){ if (x
>s; int l=strlen(s); int n=l; rep(i,1,l) extend(s[i-1]-'a'),size[lst]++,pos[lst]=i; rep(i,1,node) t[len[i]]++; rep(i,1,node) t[i]+=t[i-1]; rep(i,1,node) a[t[len[i]]--]=i; dep(i,node,1) { int x=a[i]; size[fa[x]]+=size[x]; } rep(i,1,node) if (size[i]==1) { S.change1(1,1,n,pos[i]-len[i]+1,pos[i]-len[fa[i]],len[i]); if (fa[i]) S.change2(1,1,n,pos[i]-len[fa[i]]+1,pos[i],1+len[fa[i]]); } rep(i,1,n) cout<
<

 

转载于:https://www.cnblogs.com/yinwuxiao/p/9366063.html

你可能感兴趣的文章
vue如何使用rules对表单字段进行校验
查看>>
ural 2032 Conspiracy Theory and Rebranding (数学水题)
查看>>
jqZoom插件
查看>>
lambda
查看>>
?: $ 用法
查看>>
R语言与数据挖掘学习笔记
查看>>
asp.net甘特图控件免费下载地址
查看>>
Linux 上的Tomcat配置输入域名直接访问项目
查看>>
Ubuntu12.04安装YouCompleteMe插件
查看>>
MySQL基础命令小结
查看>>
vue中使用sass的配置方法
查看>>
PHP读取XML数据中CDATA内数值
查看>>
JMeter执行dos命令
查看>>
Spring MVC 对静态资源的处理
查看>>
水晶报表
查看>>
jQuery 2.0.3 源码分析 Deferred(最细的实现剖析,带图)
查看>>
华为C语言编程规范
查看>>
开源机辅翻译系统
查看>>
博客作业06--图
查看>>
Linux查看端口占用情况
查看>>