【hihocoder】sam-2
2024-10-21 11:42:42
原意是把sam那一堆做完……
这题还是很sb的,$\sum{maxlen(s)-minlen(s)+1}$就是本质不同的子串数量
然后因为suffix link的性质,maxlen[fa[s]]=minlen[s]-1
所以等价于求$\sum{maxlen(s)-maxlen(fa[s])}$
这个插入的时候随手做就行了。
类似的sb题还有SDOI2016的生成魔咒
(真是不知道省选考这种题意义何在)
#include<bits/stdc++.h>
#define N 1000010
using namespace std;
typedef long long ll;
int a[N],n;ll ans=;
struct Suffix_Automaton{
int cnt,last,ch[N<<][],l[N<<],fa[N<<];
Suffix_Automaton(){cnt=last=;}
void ins(int c){
int p=last,np=++cnt;last=np;l[np]=l[p]+;
for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
if(!p)fa[np]=;
else{
int q=ch[p][c];
if(l[p]+==l[q])fa[np]=q;
else{
int nq=++cnt;l[nq]=l[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];fa[np]=fa[q]=nq;
for(;p&&ch[p][c]==q;p=fa[p])ch[p][c]=nq;
}
}
ans+=l[np]-l[fa[np]];
}
}sam;
inline char read(){
char ch;
do{ch=getchar();}while(ch<'a'||ch>'z');
return ch;
}
int main(){
char c=read();
while(c>='a'&&c<='z')a[++n]=c-'a',c=getchar();
for(int i=;i<=n;i++)sam.ins(a[i]);
printf("%lld\n",ans);
return ;
}
最新文章
- 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛
- Javascript之旅——第二站:对象和数组
- 11.1---有序数组合并(CC150)
- 随机获取Mysql数据表的一条或多条记录
- Codeforces Gym 100431G Persistent Queue 可持久化队列
- 转:2014年最酷的30个JavaScript库
- perl 爬取数据<;1>;
- C#单元测试工具包:MvcContrib
- vim编辑器设置文件的fileformat
- 12C dbca silent
- 在linux环境下tomcat 指定 jdk或jre版本
- Hessian源码分析--HessianSkeleton
- Web API之service worker
- CSS背景与边框属性-----box-shadow
- 补全爬取的url
- 编写陈旭,实现通过字符型变量创建boolean值,再将其转换为字符串输出,观察输出后的字符串与创建Boolean对象时给定的参数是否相等.
- Android组件化之终极方案
- iOS : 判断运行设备类型是否是iPad
- 关于jq ajax封装以及ajax上传Webapi
- Python安装模块出错(No module named setuptools)解决方法
热门文章
- openstack之Glance介绍
- 生成模型(Generative Model)Vs 判别模型(Discriminative Model)
- 3. 无重复字符的最长子串(O(N))
- hdu1950 Bridging signals
- BZOJ3526 [Poi2014]Card 【线段树】
- sass的mixin,extend,placeholder,function
- 剑桥offer系列(1~10)
- 获取文件名称 basename 用法
- JavaScript的性能优化:加载和执行
- MySQL查看所有用户及拥有权限