博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LightOJ 1428 Melody Comparison(后缀数组)
阅读量:6906 次
发布时间:2019-06-27

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

题目链接:

题意:若一个串t是A的子串且t不包含B,称t为A的合法子串。求A不同的合法子串的个数。

思路:首先求出B在A中出现的位置,t[i]表示从A串的i位置向后最早匹配完B的位置为t[i],注意是匹配完B。这样求出sa和height数组后,枚举i从1到n,设x=t[sa[i]]-sa[i],也就是sa[i]这个位置最多产生x个子串,再减去min(x,height[i])就是实际产生的子串。

int r[N],sa[N],wa[N],wb[N],wd[N],rank[N],h[N];int cmp(int *r,int a,int b,int len){    return r[a]==r[b]&&r[a+len]==r[b+len];}void da(int *r,int *sa,int n,int m){    int i,j,p,*x=wa,*y=wb,*t;    FOR0(i,m) wd[i]=0;    FOR0(i,n) wd[x[i]=r[i]]++;    FOR1(i,m-1) wd[i]+=wd[i-1];    FORL0(i,n-1) sa[--wd[x[i]]]=i;    for(j=1,p=1;p
<<=1,m=p) { p=0; FOR(i,n-j,n-1) y[p++]=i; FOR0(i,n) if(sa[i]>=j) y[p++]=sa[i]-j; FOR0(i,m) wd[i]=0; FOR0(i,n) wd[x[i]]++; FOR1(i,m-1) wd[i]+=wd[i-1]; FORL0(i,n-1) sa[--wd[x[y[i]]]]=y[i]; t=x;x=y;y=t;p=1;x[sa[0]]=0; FOR1(i,n-1) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++; }}void calHeight(int *r,int *sa,int n){ int i,j,k=0; FOR1(i,n) rank[sa[i]]=i; FOR0(i,n) { if(k) k--; j=sa[rank[i]-1]; while(i+k

  

转载地址:http://vngdl.baihongyu.com/

你可能感兴趣的文章
北京新机场 严打无人机“黑飞”
查看>>
8点1氪|阿里巴巴第三财季营收破千亿;传滴滴拟裁员25%;饿了么口碑超30亿美元融资已逐步到位...
查看>>
程序员用代码将近200个小时,为自己DIY一个手机音乐播放器
查看>>
CentOS 7安装TCP BBR拥塞算法
查看>>
JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】...
查看>>
微软洪小文:真正的AI不应基于大数据,而需从小数据、零数据着手
查看>>
koroFileHeader 非常实用的Vscode 插件[用于添加文件头部注释]
查看>>
java多线程的杂谈
查看>>
BCH支付服务商Bitek为哥伦比亚商家提供比索兑换服务
查看>>
Centos6.8安装node生产环境
查看>>
这次不会说我的正则教程没写全了吧??
查看>>
LeetCode16.最接近的三数之和 JavaScript
查看>>
2017 Material design 第三章第二节《Icons》
查看>>
你凭什么做好互联网?
查看>>
【火炉炼AI】机器学习014-用SVM构建非线性分类模型
查看>>
Java线程的CPU时间片
查看>>
《webpack文档》学习笔记
查看>>
[iOS][!] Invalid `Podfile` file [!] Unsupported options `{ exclusive=
查看>>
Swift 优雅的适配大小
查看>>
iOS 小游戏项目——你话我猜升级版
查看>>