CSU1656: Paper of FlyBrother(后缀数组)
来源:互联网 发布:淘宝美工店铺装修教程 编辑:程序博客网 时间:2024/06/08 18:48
Description
FlyBrother is a superman, therefore he is always busy saving the world.
To graduate from NUDT is boring but necessary for him. Typically We need to post an paper to get Graduate Certificate, however being one superman, FlyBrother wants to make his paper perfect. A paper is a lower case string. To make it perfect, FlyBrother wanna the number of different substrings in the paper. It is quite a silly problem for FlyBrother, but because he is so busy, can you help him to solve it?
Input
There are several cases. Process till EOF.
For each case, there is a line of lower case string (1<=length<=100000).
Output
For each case, output one number in a line of the answer described in the problem.
Sample Input
aaab
Sample Output
15
HINT
题意:
求不同的字符串个数
思路:
在我的后缀数组题目小结里有一样的的题目,模板题
#include <iostream>#include <stdio.h>#include <string.h>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <bitset>#include <algorithm>#include <climits>using namespace std;#define LS 2*i#define RS 2*i+1#define UP(i,x,y) for(i=x;i<=y;i++)#define DOWN(i,x,y) for(i=x;i>=y;i--)#define MEM(a,x) memset(a,x,sizeof(a))#define W(a) while(a)#define gcd(a,b) __gcd(a,b)#define LL long long#define N 100005#define MOD 1000000007#define INF 0x3f3f3f3f#define EXP 1e-8LL wa[N],wb[N],wsf[N],wv[N],sa[N];LL rank1[N],height[N],s[N],a[N];char str[N],str1[N],str2[N];//sa:字典序中排第i位的起始位置在str中第sa[i]//rank:就是str第i个位置的后缀是在字典序排第几//height:字典序排i和i-1的后缀的最长公共前缀LL cmp(LL *r,LL a,LL b,LL k){ return r[a]==r[b]&&r[a+k]==r[b+k];}void getsa(LL *r,LL *sa,LL n,LL m)//n要包含末尾添加的0{ LL i,j,p,*x=wa,*y=wb,*t; for(i=0; i<m; i++) wsf[i]=0; for(i=0; i<n; i++) wsf[x[i]=r[i]]++; for(i=1; i<m; i++) wsf[i]+=wsf[i-1]; for(i=n-1; i>=0; i--) sa[--wsf[x[i]]]=i; p=1; j=1; for(; 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++) wsf[i]=0; for(i=0; i<n; i++) wsf[wv[i]]++; for(i=1; i<m; i++) wsf[i]+=wsf[i-1]; for(i=n-1; i>=0; i--) sa[--wsf[wv[i]]]=y[i]; t=x; x=y; y=t; x[sa[0]]=0; for(p=1,i=1; i<n; i++) x[sa[i]]=cmp(y,sa[i-1],sa[i],j)? p-1:p++; }}void getheight(LL *r,LL n)//n不保存最后的0{ LL i,j,k=0; for(i=1; i<=n; i++) rank1[sa[i]]=i; for(i=0; i<n; i++) { if(k) k--; else k=0; j=sa[rank1[i]-1]; while(r[i+k]==r[j+k]) k++; height[rank1[i]]=k; }}LL t,ans,n,m;int main(){ LL i,j,k,len; W(~scanf("%s",str)) { len = strlen(str); UP(i,0,len-1) s[i]=str[i]; s[len] = 0; getsa(s,sa,len+1,300); getheight(s,len); ans = (1+len)*len/2; UP(i,2,len) ans-=height[i]; printf("%lld\n",ans); }}
0 0
- CSU1656: Paper of FlyBrother(后缀数组)
- CSU 1656 Paper of FlyBrother(后缀数组)
- CodeForces 653F Paper task(rmq+二分+后缀数组)
- timus 1517 Freedom of Choice//后缀数组
- Ural 1517. Freedom of Choice 后缀数组
- URAL 1517 Freedom of Choice 后缀数组
- SPOJ220:Relevant Phrases of Annihilation(后缀数组)
- Notes of Writing paper
- CF 461C - Appleman and a Sheet of Paper (树状数组)
- CF 【树状数组】461C. Appleman and a Sheet of Paper
- 461C. Appleman and a Sheet of Paper(树状数组)
- Ural1517 Freedom of choice, 后缀数组,最长公共子串
- SPOJ 220 . Relevant Phrases of Annihilation(后缀数组)
- SPOJ 220 Relevant Phrases of Annihilation (后缀数组)
- 【后缀数组】【spoj 220】Relevant Phrases of Annihilation
- SPOJ 220 PHRASES Relevant Phrases of Annihilation 后缀数组
- URAL 1517 Freedom of Choice 后缀数组 入门
- spoj 220 Relevant Phrases of Annihilation (后缀数组应用)
- Java集合6:ArrayList的实现原理
- js正则匹配数字、大小写字母、下划线、中线和点
- Android 属性动画(Property Animation) 完全解析 (上)
- Java集合7:LinkedList的实现原理
- java多态的静态实例
- CSU1656: Paper of FlyBrother(后缀数组)
- Android 属性动画(Property Animation) 完全解析 (下)
- unity3D创建英雄选择栏
- 使用UltraISO制作U盘启动盘
- java基础--网络编程
- java笔记之一
- 深圳之行---错过
- 02-线性结构4. Pop Sequence (25)
- 递归函数的理解