博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gym101431B
阅读量:6831 次
发布时间:2019-06-26

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

以此纪念我都快忘了的后缀自动机(捂脸)

不过这题有两种做法:

用后缀自动机,先把原串再接遍中间加入特殊连接字符再把原串反接两遍,对这个新构造出的串做后缀自动机。(或者直接建立广义后缀自动机)

下面只要统计长度小于等于 n 的串即可。这可以从 parent 树即后缀树来考虑,注意到每个节点可以接收的子串长度为[mxlen[fa[x]]+1,mxlen[x]]

只要对这个长度区间对n取min再统计即可

1 #include
2 3 using namespace std; 4 typedef long long ll; 5 int fa[400010],go[400010][26],mx[400010],n,t,last; 6 char a[50010]; 7 void add(int c) 8 { 9 int np,nq,q,p=last;10 if (!go[last][c])11 {12 np=++t;13 mx[np]=mx[p]+1;14 for (;p&&!go[p][c]; p=fa[p]) go[p][c]=np;15 }16 else np=0;17 if (!p) fa[np]=1;18 else {19 q=go[p][c];20 if (mx[q]==mx[p]+1) fa[np]=q;21 else {22 nq=++t;23 mx[nq]=mx[p]+1;24 memcpy(go[nq],go[q],sizeof(go[q]));25 fa[nq]=fa[q]; fa[q]=fa[np]=nq;26 for (;go[p][c]==q; p=fa[p]) go[p][c]=nq;27 }28 }29 last=go[last][c];30 }31 32 int main()33 {34 scanf("%d",&n);35 scanf("%s",a+1);36 last=t=1;37 for (int i=1; i<=n; i++)38 add(a[i]-'a');39 for (int i=1; i<=n; i++)40 add(a[i]-'a');41 last=1;42 for (int i=n; i; i--)43 add(a[i]-'a');44 for (int i=n; i; i--)45 add(a[i]-'a');46 ll ans=0;47 for (int i=2; i<=t; i++)48 ans+=min(n,mx[i])-min(mx[fa[i]],n);49 printf("%lld\n",ans);50 }
自动机

另一种诡异的做法:由于数据随机,那么当串长足够大时很大概率都是互不相同的,干脆就直接认为全不相同

因此只要找小串长的不同种类即可,这就直接用 hash

暴力判断即可。

1 #include
2 3 using namespace std; 4 typedef long long ll; 5 char a[50010]; 6 set
f[20]; 7 int n; 8 using namespace std; 9 typedef long long ll;10 const int mx=15;11 int main()12 {13 scanf("%d",&n);14 scanf("%s",a);15 for (int i=0; i
View Code

转载于:https://www.cnblogs.com/phile/p/7206608.html

你可能感兴趣的文章
Shopilex - 开源免费网店系统
查看>>
ubuntu14.04 安装搜狗输入法
查看>>
内省—beanutils工具包
查看>>
[WP8.1UI控件编程]SemanticZoom控件实现分组列表
查看>>
Cycling Label
查看>>
CreateFileMapping使用方法
查看>>
MySQL load data infile
查看>>
TCommThread -- 在delphi线程中实现消息循环
查看>>
Windows内核之线程的调度,优先级,亲缘性
查看>>
按键控制电机显示速度
查看>>
分享工作中遇到的问题积累经验 事务日志太大导致insert不进数据
查看>>
怎样删除windows.old文件
查看>>
微软职位内部推荐-Senior Software Engineer
查看>>
线程同步中使用信号量AutoResetEvent
查看>>
软件架构学习小结
查看>>
hessian学习
查看>>
Lua 之 userdata
查看>>
致青春:不虚度,是对青春最好的交代
查看>>
sersync2 实时同步配置
查看>>
mysql 的存储过程调试软件
查看>>