題目大意:
求串中不同的子串的個數。
思路分析:
子串一定是某一個後綴的前綴。
所以我們把每一個後綴拿出來,分析它有多少個前綴,然後除去它與sa數組中前面那個後綴相同的前綴。
最後也就是 ans = segma (n-sa[i] + height[i])....
#include#include #include #include #define maxn 1000005 using namespace std; char str[maxn]; int sa[maxn],t1[maxn],t2[maxn],c[maxn],n; void suffix(int m) { int *x=t1,*y=t2; for(int i=0;i =0;i--)sa[--c[x[i]]]=i; for(int k=1;k<=n;k<<=1) { int p=0; for(int i=n-k;i =k)y[p++]=sa[i]-k; for(int i=0;i =0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(int i=1;i =n)break; m=p; } } int rank[maxn],height[maxn]; void getheight() { int k=0; for(int i=0;i