HDU 5769 Substring(后缀数组)
【题目链接】 http://acm.hdu.edu.cn/showproblem.php?pid=5769
【题目大意】
在一个串中求出包含字母的子串个数,
只要存在一个字符不相等的子串即可视为不同的子串。
【题解】
因为要求存在字符不相等因此我们可以利用后缀数组统计,
后缀数组的h数组可以记录前后两个后缀的最长公共前缀这样子相同的前缀就不会被多次计算,
保存每个位置之后出现的最近的要求的字母的位置,
从该后缀的包含该字母的位置往后且不在最长公共前缀的范围内的位置都可以作为子串的右端点,
统计左端点,计算符合条件的右端点的数量总和就是答案。
【代码】
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N=1000005;
- int T,Cas=1,n,Rank[N],sa[N],h[N],tmp[N],cnt[N],nxt[N];
- char c,s[N];
- void suffixarray(int n,int m){
- int i,j,k;n++;
- for(i=0;i<2*n+5;i++)Rank[i]=sa[i]=h[i]=tmp[i]=0;
- for(i=0;i<m;i++)cnt[i]=0;
- for(i=0;i<n;i++)cnt[Rank[i]=s[i]]++;
- for(i=1;i<m;i++)cnt[i]+=cnt[i-1];
- for(i=0;i<n;i++)sa[--cnt[Rank[i]]]=i;
- for(k=1;k<=n;k<<=1){
- for(i=0;i<n;i++){
- j=sa[i]-k;
- if(j<0)j+=n;
- tmp[cnt[Rank[j]]++]=j;
- }sa[tmp[cnt[0]=0]]=j=0;
- for(i=1;i<n;i++){
- if(Rank[tmp[i]]!=Rank[tmp[i-1]]||Rank[tmp[i]+k]!=Rank[tmp[i-1]+k])cnt[++j]=i;
- sa[tmp[i]]=j;
- }memcpy(Rank,sa,n*sizeof(int));
- memcpy(sa,tmp,n*sizeof(int));
- if(j>=n-1)break;
- }for(j=Rank[h[i=k=0]=0];i<n-1;i++,k++)
- while(~k&&s[i]!=s[sa[j-1]+k])h[j]=k--,j=Rank[sa[j]+1];
- }
- int main(){
- scanf("%d",&T);
- while(T--){
- scanf(" %s",s); c=s[0];
- scanf(" %s",s); n=strlen(s);
- suffixarray(n,256);
- int pre=-1;
- for(int i=n-1;i>=0;i--){
- if(s[i]==c)pre=i;
- nxt[i]=pre;
- }long long ans=0;
- if(nxt[sa[1]]!=-1)ans=n-nxt[sa[1]];
- for(int i=2;i<=n;i++){
- int t=nxt[sa[i]];
- if(t==-1)continue;
- t=max(t,sa[i]+h[i]);
- ans=ans+n-t;
- }printf("Case #%d: %lld\n",Cas++,ans);
- }return 0;
- }
HDU 5769 Substring(后缀数组)的更多相关文章
- hdu 5769 Substring 后缀数组 + KMP
http://acm.hdu.edu.cn/showproblem.php?pid=5769 题意:在S串中找出X串出现的不同子串的数目? 其中1 <= |S| < $10^5$ 官方题解 ...
- HDU 5769 Substring 后缀数组
Substring Problem Description ?? is practicing his program skill, and now he is given a string, he h ...
- HDU 5679 Substring 后缀数组判重
题意:求母串中有多少不同的包含x字符的子串 分析:(首先奉上FZU官方题解) 上面那个题就是SPOJ694 ,其实这两个题一样,原理每次从小到大扫后缀sa数组,加上新的当前后缀的若干前缀,再减去重复的 ...
- hdu 1403 Longest Common Substring 后缀数组 模板题
题目链接 题意 问两个字符串的最长公共子串. 思路 加一个特殊字符然后拼接起来,求得后缀数组与\(height\)数组.扫描一遍即得答案,注意判断起始点是否分别在两个串内. Code #include ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- hdu_1403_Longest Common Substring(后缀数组的应用)
题目链接:hdu_1403_Longest Common Substring 题意: 给你两个字符串,然你找最长的公共子串 题解: 后缀数组的经典应用,要找两个字符串的公共子串,那么就相当于找两个串的 ...
- HDU 6194【后缀数组】
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=6194] 题意: 给你一个长度不大于1e5的字符串,然后然你判断其子串严格出现k次的子串个数. 题解: ...
- POJ3693 Maximum repetition substring 后缀数组
POJ - 3693 Maximum repetition substring 题意 输入一个串,求重复次数最多的连续重复字串,如果有次数相同的,则输出字典序最小的 Sample input ccab ...
- 2016多校联合训练4 F - Substring 后缀数组
Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...
随机推荐
- IS--A与 Has-a 区别
- loading 动画效果(收藏起来以后留着慢慢用)
动画效果一: html代码: <div class="spinner"> <div class="rect1"></div&g ...
- 使用MySQL处理百万级以上数据时,不得不知道的几个常识
最近一段时间参与的项目要操作百万级数据量的数据,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍.之前数据量小的时候,查询语句的好坏不会对执行时间有什么明显的 ...
- 雕爷牛腩这样判断零售未来-搜狐IT
雕爷牛腩这样判断零售未来-搜狐IT 雕爷牛腩这样判断零售未来
- nginx File not found 错误分析与解决方法
使用php-fpm解析PHP,出错提示如下:"No input file specified","File not found",原因是php-fpm进程找不到 ...
- swig模板下拉框应用
<div class="form-group"> <label><span class="fa fa-asterisk red"& ...
- SQL SERVER 2000/2005/2008数据库数据迁移到Oracle 10G细述
最近参与的一个系统涉及到把SQL Server 2k的数据迁移到Oracle 10G这一非功能需求.特将涉及到相关步骤列举如下供大家参考: 环境及现有资源: 1.OS: Windows 7 Enter ...
- USB OTG简单介绍
1 引言 随着USB2.0版本号的公布,USB越来越流行,已经成为一种标准接口.如今,USB支持三种传输速率:低速(1.5Mb/s).全速(12Mb/s)和快速(480Mb/s),四种传输类型:块传输 ...
- DOM4J读取XML文件
最近在做DRP的项目,其中涉及到了读取配置文件,用到了DOM4J,由于是刚开始接触这种读取xml文件的技术,好奇心是难免的,于是在网上又找了一些资料,这里就结合找到的资料来谈一下读取xml文件的4中方 ...
- 高效的SQLSERVER分页查询(推荐)
Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID.YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询 ...