[spojSUBLEX]Lexicographical Substring Search
2024-10-19 13:04:52
建立后缀自动机,对于同一个节点,出现次数是相同的(right的大小),同时满足单调性(长度越长出现次数越少),所以只需要考虑最长的串即可。
PS:似乎也并不需要求依次后缀的max,不知道为什么……
1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 250005
4 int V,last,k,a[N],id[N<<1],sz[N<<1],ans[N],len[N<<1],sum[N<<1],fa[N<<1],ch[N<<1][31];
5 char s[N];
6 void add(int c){
7 int p=last,np=last=++V;
8 sz[V]=1;
9 len[np]=len[p]+1;
10 for(;(p)&&(!ch[p][c]);p=fa[p])ch[p][c]=V;
11 if (!p)fa[np]=1;
12 else{
13 int q=ch[p][c];
14 if (len[q]==len[p]+1)fa[np]=q;
15 else{
16 int nq=++V;
17 len[nq]=len[p]+1;
18 memcpy(ch[nq],ch[q],sizeof(ch[q]));
19 fa[nq]=fa[q];
20 fa[q]=fa[np]=nq;
21 for(;(p)&&(ch[p][c]==q);p=fa[p])ch[p][c]=nq;
22 }
23 }
24 }
25 int main(){
26 scanf("%s",s);
27 V=last=1;
28 for(int i=0;s[i];i++)add(s[i]-'a');
29 for(int i=1;i<=V;i++)a[len[i]]++;
30 for(int i=0;s[i];i++)a[i+1]+=a[i];
31 for(int i=1;i<=V;i++)id[a[len[i]]--]=i;
32 for(int i=V;i;i--){
33 ans[len[id[i]]]=max(ans[len[id[i]]],sz[id[i]]);
34 sz[fa[id[i]]]+=sz[id[i]];
35 }
36 for(int i=1;s[i-1];i++)printf("%d\n",ans[i]);
37 }
最新文章
- Web存储-Web Storage
- CSS与JavaScript的一些问题汇总
- Generics and Collection (1)
- C# Enum 简易权限设计 使用FlagsAttribute属性
- Maven+Spring+Mybatis+Security+Mysql简短的框架
- Python学习_数据处理split方法
- Android 的开源电话/通讯/IM聊天项目全集
- gdb学习(一个)[再版]
- 转:iOS开发之多种Cell高度自适应实现方案的UI流畅度分析
- jquery实现ajax提交表单的方法总结
- Log4j配置和解释
- Excel无法打开文件xxx.xlsx,因为文件格式或文件扩展名无效。请确定文件未损坏,并且文件扩展名与文件的格式匹配
- C#保留小数点后几位
- 小强学渲染之Unity Shader编程HelloWorld
- JavaEE 之 WebService
- 如何查看已经安装的nginx、apache、mysql和php的编译参数
- 如何生成Junit报告
- C++中绝对值的运算
- Oracle数据库错误大全
- 本地搭建Wooyun漏洞库环境