题目链接:点击查看

题目大意:给出一个字符串,问有多少个子串出现了两次以上,计算时彼此不能覆盖

题目分析:因为数据范围比较小,我们可以直接暴力,枚举子串的长度,利用height数组的性质将后缀分为不同的组,在每个组中尝试寻找答案即可

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<map>
#include<set>
#include<cmath>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;char str[N];int sa[N]; //SA数组,表示将S的n个后缀从小到大排序后把排好序的
//的后缀的开头位置顺次放入SA中
int t1[N],t2[N],c[N];int rk[N],height[N],len;int s[N];void build_sa(int s[],int n,int m)//n为添加0后的总长
{int i,j,p,*x=t1,*y=t2;for(i=0;i<m;i++) c[i]=0;for(i=0;i<n;i++) c[x[i]=s[i]]++;for(i=1;i<m;i++) c[i]+=c[i-1];for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;for(j=1;j<=n;j<<=1) {p=0;for(i=n-j;i<n;i++) y[p++]=i;for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;for(i=0;i<m;i++) c[i]=0;for(i=0;i<n;i++) c[x[y[i]]]++;for(i=1;i<m;i++) c[i]+=c[i-1];for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];swap(x,y);p=1,x[sa[0]]=0;for(i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+j]==y[sa[i]+j]?p-1:p++;if(p>=n) break;m=p;}
}void get_height(int s[],int n)//n为添加0后的总长
{int i,j,k=0;for(i=0;i<=n;i++)rk[sa[i]]=i;for(i=0;i<n;i++) {if(k) k--;j=sa[rk[i]-1];while(s[i+k]==s[j+k]) k++;height[rk[i]]=k;}
}void solve(int base=128)
{build_sa(s,len+1,base);get_height(s,len);
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);while(scanf("%s",str)!=EOF&&str[0]!='#'){len=strlen(str);for(int i=0;i<len;i++)s[i]=str[i]-'a'+1;s[len]=0;solve(30);int ans=0;for(int i=1;i<=len/2;i++){int mmax=-inf,mmin=inf;for(int j=2;j<=len;j++){if(height[j]>=i){mmax=max(mmax,max(sa[j],sa[j-1]));mmin=min(mmin,min(sa[j],sa[j-1]));}else{if(mmax-mmin>=i)ans++;mmax=-inf;mmin=inf;}}if(mmax-mmin>=i)ans++;}printf("%d\n",ans);}return 0;
}

HDU - 3518 Boring counting(后缀数组)相关推荐

  1. 后缀数组 --- HDU 3518 Boring counting

    Boring counting Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3518 Mean: 给你一个字符串,求:至少出 ...

  2. HDU - 6704 K-th occurrence (后缀数组+主席树)

    题目链接 题意 QQQ次询问,每次询问求SSS的子串出现KKK次的位置 思路 刚开始想的是AC自动机,但是建自动机会超时,后来学长想到后缀数组+主席树的做法Orz...Orz...Orz... 出现K ...

  3. HDU 4358 Boring Counting ★★(2012 Multi-University Training Contest 6)

    问题抽象:区间内恰好出现K次的数的个数. ------------------------------------------------------------------ UESTC出的题就是神啊 ...

  4. Boring counting HDU - 3518 (后缀数组)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  5. hdu 5008 Boring String Problem(后缀数组+rmq)

    题目链接:hdu 5008 Boring String Problem 题意: 给你一个字符串,有q个询问,每次询问该字符串所有的子串中字典序第k小的是哪个串,输出位置,如果有多个位置,输出最靠左的那 ...

  6. HDU - 5008 Boring String Problem(后缀数组+二分)

    题目链接:点击查看 题目大意:给出一个字符串,接下来给出 q 个询问,每次询问字符串中第 k 大的子串,要求输出该字串的左右端点,如果有多个答案,输出左端点最小的一个 题目分析:因为在求出后缀数组后, ...

  7. HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机

    题意:给出一个字符串,求出出现了恰好k次的子串的个数. 题解:恰好k次 = 至少k次 - 至少k+1次.答案转化为求至少出现k次的子串个数统计.构造好后缀数组以及很重要的Height数组之后.用一个k ...

  8. HDU 4416 Good Article Good sentence(12年杭州 后缀数组)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove 题目:给出一个A串,给出若干个B ...

  9. HDU 3518 HDU 4416【后缀自动机len的使用】

    max:即代码中 len 变量,它表示该状态能够接受的最长的字符串长度. min:表示该状态能够接受的最短的字符串长度.实际上等于该状态的 fail 指针指向的结点的 len + 1. max-min ...

最新文章

  1. vue/cli 3.0 脚手架【进阶】 使用 amfe-flexible 和 postcss-px2rem进行移动端适
  2. 工具|渗透利器之CrimeFlare、waf绕过脚本分享
  3. docker搭建ldap
  4. 微信小程序DAU超4.5亿 小程序开发者突破300万
  5. (c语言)判断一个正整数是否是回文数
  6. 把服务器文件,如何把文件放在服务器
  7. 05-树9 Huffman Codes (30 分)
  8. MySQL不同字段比较大小_mysql 字段定义 对 大小比较的影响
  9. 数学建模计算机部分知识,数学建模相关论文范文资料,与数学建模与计算机关系相关毕业论文题目范文...
  10. 敏捷史话系列(一)| 用一半的时间做两倍的事——Jeff Sutherland
  11. HDU 4960 Another OCD Patient 简单DP
  12. python--转换wrf输出的风场数据为网页可视化的json格式
  13. 干货 | 应用打包还是测试团队老大难问题?
  14. 【java】输入一个数输出它的绝对值
  15. UI设计存在什么意义?
  16. 51单片机实训项目之“万年历”代码原理详解
  17. Mockito中模拟静态方法
  18. 李宏毅深度学习——机器终身学习
  19. 多所“双非”跻身软科高校排名百强,特斯拉上海工厂复工在即,余承东嫌汽车芯片单价太贵,今日更多大新闻在此...
  20. 浅析电气火灾监控系统在医院的应用研究

热门文章

  1. 上一页下一页_Excel打印时一页放不下,4招轻松搞定,省下的纸叫老板加工资
  2. MySQL高级in和not in
  3. 标记-清除(Mark-Sweep)
  4. Spring5 版本新特性简述
  5. Redis中的zset 存储结构(实现)原理
  6. SpringMVC的数据响应-回写数据-返回对象或集合2(应用)
  7. maven的java工程取mysql数据库数据
  8. HDFS的API操作-创建文件和文件夹
  9. 如何判断对象是否存活之根搜索算法
  10. servlet destroy 示例_KET答题卡怎么填写?2020年KET答题卡填涂示例