http://www.spoj.com/status/ns=17418952
【每一个子串必然是某个后缀的前缀】,因此我们统计出所有的后缀中有多少个不同的前缀,就是所有不重复子串的数量了
而这个相同的前缀个数,当然就是所有height之和啦。
所以答案就是n*(n-1)/2-∑height[i]
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 1050;
int cmp(int *r,int a,int b,int l)
{
return (r[a]==r[b]) && (r[a+l]==r[b+l]);
}
// 用于比较第一关键字与第二关键字,
// 比较特殊的地方是,预处理的时候,r[n]=0(小于前面出现过的字符)
/*
DA(aa,sa,n+1,200);
calheight(aa,sa,n);
*/
int wa[N],wb[N],ws[N],wv[N];
int rank[N],height[N];
void DA(int *r,int *sa,int n,int m) //此处N比输入的N要多1,为人工添加的一个字符,用于避免CMP时越界
{
int i,j,p,*x=wa,*y=wb,*t;
for(i=0; i<m; i++) ws[i]=0;
for(i=0; i<n; i++) ws[x[i]&#