博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lightoj 1428 后缀数组
阅读量:6413 次
发布时间:2019-06-23

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

给出字符串A和B。求A的不包含B的不同字串的数量。

解法。。字符串匹配+后缀数组。

任何字串都会是某个后缀的前缀

对字串A建立后缀数组

对于排名第k的后缀 SA[k] 将会提供L-SA[k]+1个字串 其中有height[k]个前缀在之前计算过

所以每个后缀提供的新字串个数为L-SA[k]+1-height[k]

 

下面考虑不能包含B。对A,B做一次匹配。找出B在A中出现的位置。设为p1,p2,p3...pn;

对于排名第k后缀SA[k],其左边界为SA[k],右边界于与边界之间不能包含B。

即右边界为大于SA[k]的第一个pi+length(B)-2.

预处理出对于每一个左边界对应的最大合法长度MR[k]

则对于排名第k的后缀SA[k]对应的最大长度为 min(MR[SA[k]],L-SA[k]+1)

最小长度为 height[k]

二者之差大于0则累加答案。

 

由于使用了后缀数组,后缀数组本身具有匹配字符串功能。

将AB用‘$'拼接成一个新字符串,构造一次后缀数组。

就不用再写一个KMP函数。。通过两次构造后缀数组即可。

#include 
#include
#include
using namespace std; const int MAXN = 100010;char s[MAXN];int NE[MAXN];int HE[MAXN],TI[MAXN];int X[MAXN],Y[MAXN],SA[MAXN];int height[MAXN];int MR[MAXN];int *rank,*SV;int L,L1,L2,p,q;int NP; int getfir(int &k){ while (++k<=NP) if (HE[k]) return k; return 0;} bool eq(int i,int j,int l){ int p1,p2; p1 = SV[i]; p2 = SV[j]; if (p1!=p2) return false; p1 = i+l/2<=L? SV[i+l/2]:0; p2 = j+l/2<=L? SV[j+l/2]:0; return p1==p2;} int Jsort(int l){ memset(HE,0,sizeof(HE)); memset(TI,0,sizeof(TI)); for (int i=L-l/2+1;i<=L;i++){ if (HE[rank[i]]){ NE[TI[rank[i]]] = i; TI[rank[i]] = i; } else HE[rank[i]]=TI[rank[i]]=i; } for (int i=1;i<=L;i++){ if (SA[i]
0;i--) if (MR[i]<0) MR[i]=MR[i+1]+1; s[L1]=0; L = L1; prework(); for (int l=1;Jsort(l)
<<=1); calcheight(); long long ans=0; for (int i=1;i
0) ans+=(r-l); } printf("Case %d: %lld\n",++cas,ans); }}
View Code

 

 

转载于:https://www.cnblogs.com/qinhang3/p/3336703.html

你可能感兴趣的文章
spring事务学习(转账案例)(二)
查看>>
[官方教程] [ES4封装教程]1.使用 VMware Player 创建适合封装的虚拟机
查看>>
http协议与http代理
查看>>
【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例...
查看>>
Redis+Spring缓存实例
查看>>
Storm集群安装详解
查看>>
centos7.x搭建svn server
查看>>
原码编译安装openssh6.7p1
查看>>
项目实战:自定义监控项--监控CPU信息
查看>>
easyui-datetimebox设置默认时分秒00:00:00
查看>>
蚂蚁分类信息系统5.8多城市UTF8开源优化版
查看>>
在django1.2+python2.7环境中使用send_mail发送邮件
查看>>
“Metro”,移动设备视觉语言的新新人类
查看>>
PHP源代码下载(本代码供初学者使用)
查看>>
Disruptor-NET和内存栅栏
查看>>
Windows平台ipod touch/iphone等共享笔记本无线上网设置大全
查看>>
播放加密DVD
查看>>
产品设计体会(3013)项目的“敏捷沟通”实践
查看>>
RHEL6.3基本网络配置(1)ifconfig命令
查看>>
网络诊断工具之—路由追踪tracert命令
查看>>