hdu3518
题解:
后缀数组
枚举长度为k(1<=k<=len/2)的满足要求的子串个数
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=;
char str[N];
int wa[N],wb[N],wv[N],Ws[N],sa[N],Rank[N],height[N];
int cmp(int *r,int a,int b,int l)
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
void da(const char *r,int *sa,int n,int m)
{
int *x=wa,*y=wb,*t;
for (int i=;i<m;i++) Ws[i]=;
for (int i=;i<n;i++) Ws[x[i]=r[i]]++;
for (int i=;i<m;i++) Ws[i]+=Ws[i-];
for (int i=n-;i>=;i--) sa[--Ws[x[i]]]=i;
for (int j=,p=;p<n;j*=,m=p)
{
p=;
for (int i=n-j;i<n;i++) y[p++]=i;
for (int i=;i<n;i++)
if (sa[i]>=j) y[p++]=sa[i]-j;
for (int i=;i<n;i++) wv[i]=x[y[i]];
for (int i=;i<m;i++) Ws[i]=;
for (int i=;i<n;i++) Ws[wv[i]]++;
for (int i=;i<m;i++) Ws[i]+=Ws[i-];
for (int i=n-;i>=;i--) sa[--Ws[wv[i]]]=y[i];
swap(x,y);x[sa[]]=;p=;
for (int i=;i<n;i++)x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
}
return;
}
void calheight(const char *r,int *sa,int n)
{
int j,k=;
for (int i=;i<=n;i++) Rank[sa[i]]=i;
for (int i=;i<n;height[Rank[i++]]=k)
for (k?k--:,j=sa[Rank[i]-];r[i+k]==r[j+k];k++);
return;
}
int solve(int k,int len)
{
int maxx=,minn=INT_MAX,ans=;
for (int i=;i<=len;i++)
{
if (height[i]>=k)
maxx=max(maxx,max(sa[i-],sa[i])),minn=min(minn,min(sa[i-],sa[i]));
else
{
if (maxx-minn>=k) ans++;
maxx=,minn=INT_MAX;
}
}
if (maxx-minn>=k)ans++;
return ans;
}
int main()
{
while (~scanf("%s",str) && strcmp(str,"#")!=)
{
int len=strlen(str);
da(str,sa,len+,);
calheight(str,sa,len);
ll ans=;
for (int i=;i<=len/;i++)ans+=solve(i,len);
printf("%d\n",ans);
}
return ;
}
hdu3518的更多相关文章
- HDU3518 后缀数组求不可重叠重复出现的不同子串个数
枚举子串长度,根据height分组,如果本组sa最小值与sa最大值之差超过枚举的长度,则本组对于答案贡献为1. #include <iostream> #include <vecto ...
- hdu3518 Boring counting
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=3518 题目: Boring counting Time Limit: 2000/1000 MS ...
- hdu3518(后缀数组)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3518 题意: 给出一个字符串, 问其中有多少字串出现了两次以上(计算次数时不能彼此覆盖, 如 &qu ...
- hdu3518 Boring Counting[后缀排序]
裸的统计不同的重复出现子串(不重叠)种数的题.多次使用后缀排序要注意小细节.y数组在重复使用时一定要清空,看那个line25 +k就明白了 ,cnt也要清空,为什么就不说了 #include<b ...
- 【hdu3518】Boring counting
题意:找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠). 后缀数组 枚举字串长度h,对于每一次的h,利用height数组,找出连续的height大于等于h的里面最左端和最右端得为之l ...
- [HDU3518]Boring counting(后缀数组)
传送门 求出现超过1次的不重叠子串的个数 根据论文中的方法. 枚举子串的长度 k. 用 k 给 height 数组分组,每一组求解,看看当前组的位置最靠后的后缀和位置最靠前的后缀所差个数是否大于长度, ...
- hdu3518 Boring counting(后缀数组)
Boring counting 题目传送门 解题思路 后缀数组.枚举每种长度,对于每个字符串,记录其最大起始位置和最小起始位置,比较是否重合. 代码如下 #include <bits/stdc+ ...
- poj 2774 Long Long Message 后缀数组基础题
Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 24756 Accepted: 10130 Case Time Limi ...
随机推荐
- 学习笔记37—WIN7系统本地连接没有有效的IP地址 电脑本地连接无有效ip配置怎么办
WIN7系统本地连接没有有效的IP地址 电脑本地连接无有效ip配置怎么办 家中有两台笔记本都有无线网卡,现在想让两台笔记本都能够上网,而又不想购买路由器,交换机等设备,这个时候怎么办呢? 其实只要进行 ...
- Inception网络
2018-12-09 19:39:38 一.1 * 1卷积 pooling可以对feature map的height,width进行修改,但是对通道数目无法修改. 1 * 1卷积可以在不改变图像大小的 ...
- 使用pymysql操作数据库
学习如何使用python的pymysql模块来操作mysql数据库 这里的基本用法主要借鉴了该篇博客:https://www.cnblogs.com/woider/p/5926744.html 因为这 ...
- 全站从http升级到https(WordPress博客)
最近几年HTTPS取代HTTP已经成为大趋势,HTTP是超文本传输协议,信息是明文传输的,而HTTPS是安全超文本传输协议,需要证书和提供安全连接,换句话说,HTTPS是嵌套了SSL加密的HTTP连接 ...
- vs2013+caffe+cpu
1.下载caffe官网提供的工具包,复制Windows下CommonSettings.props.example,后缀改为CommonSettings.props 2.由于电脑无GPU,所以修改复制过 ...
- SPL之AccessArray
<?php /** * Class MyArrayAccess * 提供像访问数组一样访问对象的能力的接口 */ class MyArrayAccess implements ArrayAcce ...
- 【IDEA】【1】准备工作
1,官方网址(https://www.jetbrains.com/idea/) 2,网盘地址(为ideaIU-2018.2.5) 链接:https://pan.baidu.com/s/1oLgY_Pb ...
- Object.keys的使用
链接:https://www.nowcoder.com/questionTerminal/52c41b84e32a4158883cb112a1d1f850来源:牛客网 输出对象中值大于2的key的数组 ...
- NABCD框架(作业和事件的定期提醒)及第八周学习进度条
NABCD框架(作业和事件的定期提醒): N(need,需求): 你的创意解决了用户的什么需求? 我们的创意能够一定程度上督促我们的用户(学生)尽快完成自己近期的任务或者是作业.我们认为如果增设定时提 ...
- (三)使用链式数据实现包(java)
目标: 1) 描述数据的链式组织方式 2) 描述如何在链式节点链的开头添加新节点 3) 描述如何删除链式节点链的首节点 4) 描述如何在链式节点链中找到某个数据 5) 使用链式节点链实现ADT包 6) ...