博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 3473 字符串
阅读量:6676 次
发布时间:2019-06-25

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

思路

广义SAM的题目,先全部插入,然后每个字符串在SAM上匹配,如果发现当前sz小于k(就是前缀不满足条件),就跳fail(找前缀的后缀,就是找子串)到满足条件为止,然后一个满足条件的节点,它的所有parent Tree上的祖先也必定满足条件,所以一个满足条件的节点的贡献就是它的maxlen

ps:貌似求sz除了我这种,还可以set启发式合并

代码

#include 
#include
#include
#include
#include
#include
using namespace std;int maxlen[201000],minlen[201000],trans[201000][26],suflink[201000],ans[201000],sz[201000],last[201000],endpos[201000],Nodecnt,n;string s[101000];int New_state(int _maxlen,int _minlen,int *_trans,int _sz,int _last,int _suflink){ ++Nodecnt; maxlen[Nodecnt]=_maxlen; minlen[Nodecnt]=_minlen; if(_trans) for(int i=0;i<26;i++) trans[Nodecnt][i]=_trans[i]; sz[Nodecnt]=_sz; last[Nodecnt]=_last; suflink[Nodecnt]=_suflink; return Nodecnt; }void update(int u,int x){ while(u&&last[u]!=x){ last[u]=x; sz[u]++; u=suflink[u]; }}int add_len(int u,int c,int inq){ if(trans[u][c]){ int v=trans[u][c]; if(maxlen[v]==maxlen[u]+1){ update(v,inq); endpos[v]++; return v; } int y=New_state(maxlen[u]+1,0,trans[v],sz[v],last[v],suflink[v]); suflink[v]=y; minlen[v]=maxlen[y]+1; while(u&&trans[u][c]==v){ trans[u][c]=y; u=suflink[u]; } minlen[y]=maxlen[suflink[y]]+1; update(y,inq); return y; } else{ int z=New_state(maxlen[u]+1,0,NULL,0,0,0); endpos[z]=1; while(u&&trans[u][c]==0){ trans[u][c]=z; u=suflink[u]; } if(!u){ suflink[z]=1; minlen[z]=1; update(z,inq); return z; } int v=trans[u][c]; if(maxlen[v]==maxlen[u]+1){ suflink[z]=v; minlen[z]=maxlen[v]+1; update(z,inq); return z; } int y=New_state(maxlen[u]+1,0,trans[v],sz[v],last[v],suflink[v]); suflink[v]=suflink[z]=y; minlen[v]=minlen[z]=maxlen[y]+1; while(u&&(trans[u][c]==v)){ trans[u][c]=y; u=suflink[u]; } minlen[y]=maxlen[suflink[y]]+1; update(z,inq); return z; }}int k,in[200100];queue
q;int main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); Nodecnt=1; scanf("%d %d",&n,&k); for(int i=1;i<=n;i++){ // scanf("%s",s+1); cin>>s[i]; int last=1,len=s[i].length(); // cout<
<

转载于:https://www.cnblogs.com/dreagonm/p/10756350.html

你可能感兴趣的文章
Linux Mysql Related
查看>>
Impala 和 Hive 之间 SQL 区别(翻译)
查看>>
Exception练习-Exception的正确使用
查看>>
关于rms,打开文档的时候提示您没有权限打开文档,因为您的权限已过期
查看>>
如何在eclipse里关联查看android源码
查看>>
Scala 深入浅出实战经典 第80讲:List的泛型分析以及::类和Nil对象
查看>>
10.IPSec×××高可用性技术-链路备份
查看>>
我的友情链接
查看>>
destoon 读取当前栏目名称
查看>>
HTC推出革新的HTC旗舰级Android智能手机
查看>>
switch&router-四层模式
查看>>
新博安卓培训的第一天
查看>>
游戏中常用到的碰撞检测帮助类
查看>>
访问默认共享
查看>>
01262015要看的blog——oracle tuning
查看>>
[信息图]电子商务营销的6大步骤
查看>>
Hibernate注释大全收藏
查看>>
通过openfiler模拟存储
查看>>
java学习笔记 --- String类
查看>>
1.5-cut命令
查看>>