HDU 3518 Boring counting
来源:互联网 发布:淘宝店铺活动怎么参加 编辑:程序博客网 时间:2024/05/17 03:40
ProblemDescription
035 now faced atough problem,his english teacher gives him a string,which consists with nlower case letter,he must figure out how many substrings appear at leasttwice,moreover,such apearances can not overlap each other.
Take aaaa as an example.”a” apears four times,”aa” apears two times withoutoverlaping.however,aaa can’t apear more than one time without overlaping.sincewe can get “aaa” from [0-2](The position of string begins with 0) and [1-3].But the interval [0-2] and [1-3] overlaps each other.So “aaa” can not take intoaccount.Therefore,the answer is 2(“a”,and “aa”).
Input
The input dataconsist with several test cases.The input ends with a line “#”.each test casecontain a string consists with lower letter,the length n won’t exceed 1000(n<= 1000).
Output
For each test caseoutput an integer ans,which represent the answer for the test case.you’d betteruse int64 to avoid unnecessary trouble.
Sample Input
aaaa
ababcabb
aaaaaa
#
Sample Output
2
3
3
题目大意:求出有多少个子字符串重复了两次及其以上。
方法:通过后缀数组算出height值。暴力枚举子字符串的长度,计算重复的子字符串。
#include <iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>using namespace std;int wa[1010] ,wb[1010] ,wv[1010] ,ws1[1010] ,sa[1010];int rank1[1010],height[1010];char str[1010];int cmp(int *r,int a,int b,int l){return r[a]==r[b]&&r[a+l]==r[b+l];}void da(char *r,int *sa,int n,int m){int i,j,p,*x=wa,*y=wb,*t;for(i=0;i<m;i++) ws1[i]=0;for(i=0;i<n;i++) ws1[x[i]=r[i]]++;for(i=1;i<m;i++) ws1[i]+=ws1[i-1];for(i=n-1;i>=0;i--) sa[--ws1[x[i]]]=i;for(j=1,p=1;p<n;j*=2,m=p){for(p=0,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<n;i++) wv[i]=x[y[i]];for(i=0;i<m;i++) ws1[i]=0;for(i=0;i<n;i++) ws1[wv[i]]++;for(i=1;i<m;i++) ws1[i]+=ws1[i-1];for(i=n-1;i>=0;i--) sa[--ws1[wv[i]]]=y[i];for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++)x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;}return;}void calheight(char *r,int *sa ,int n){int i,j,k=0;for(i=1;i<=n;i++) rank1[sa[i]]=i;for(i=0;i<n;height[rank1[i++]]=k)for(k?k--:0,j=sa[rank1[i]-1];r[i+k]==r[j+k];k++);return;}int main(){ int len ,ans ,flag; while(~scanf("%s",str)) { len = strlen(str); if(str[0]=='#'&&len==1) { break; } len++; da(str,sa,len,270); calheight(str,sa,len-1); ans = 0; int min1 ,max1; for(int i = 1;i<len;i++) { for(int j = 1;j<len;j++) { if(height[j] >= i) { min1 = max1 = sa[j-1]; flag = 0; for(;j < len;j++) { if(height[j] < i) { if(max1 - min1 >= i) { ans++; } flag = 1; break; } else { min1 = min(min1,min(sa[j-1],sa[j])); max1 = max(max1,max(sa[j-1],sa[j])); } } if(!flag) { if(max1 - min1 >= i) { ans++; } } } } } printf("%d\n",ans); } return 0;}
- hdu 3518 Boring counting
- Boring counting HDU 3518
- hdu 3518 Boring counting
- hdu-3518-Boring counting
- HDU 3518 Boring counting
- HDU 3518 Boring counting
- hdu 3518 Boring counting
- HDU 3518 Boring counting
- HDU - 3518 Boring counting
- HDU 3518Boring counting
- HDU 3518 Boring counting(后缀数组)
- HDU 3518 Boring counting - 后缀树
- HDU 3518 Boring counting && 后缀数组
- 【HDU 3518】Boring counting【扩展KMP】
- hdu 3518 Boring counting(后缀数组)
- [后缀数组+枚举] hdu 3518 Boring counting
- 【HDU】3518 Boring counting 后缀数组
- HDU 3518 Boring counting 后缀自动机
- Myeclipse.10 破解
- Java学习第11-12天:多线程
- java中随机类 Random实现方法
- review
- [MDIT每天一小时]2014年Android系统就业前景浅析
- HDU 3518 Boring counting
- 在Eclipse中使用Maven构建Spring项目
- First Missing Positive
- DOM学习笔记
- hdu1018大数阶乘的位数,斯特林数的各种应用
- JAVA的动态代理
- Hadoop Pig学习笔记(一) 各种SQL在PIG中实现
- 第二层是指 软件,包括可用来搜集
- C/C++内存分配知识