【SPOJ】705 New Distinct Substrings

 1 #include<cstdio>

 2 #include<cstring>

 3 typedef long long LL;

 4 #define MAXN 50010

 5 char s[MAXN];

 6 int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN];

 7 int sa[MAXN],height[MAXN],Rank[MAXN];

 8 inline bool cmp(int *r,int a,int b,int len)

 9 {

10     return r[a]==r[b]&&r[a+len]==r[b+len];

11 }

12 void SA(int n,int m)

13 {

14     int i,j,p,*x=wa,*y=wb,*t;

15     for(i=0;i<m;i++)

16         ws[i]=0;

17     for(i=0;i<n;i++)

18         ws[x[i]=s[i]]++;

19     for(i=1;i<m;i++)

20         ws[i]+=ws[i-1];

21     for(i=n-1;i>=0;i--)

22         sa[--ws[x[i]]]=i;

23     for(j=p=1;p<n;j<<=1,m=p)

24     {

25         for(p=0,i=n-j;i<n;i++)

26             y[p++]=i;

27         for(i=0;i<n;i++)

28         {

29             if(sa[i]>=j)

30                 y[p++]=sa[i]-j;

31         }

32         for(i=0;i<m;i++)

33             ws[i]=0;

34         for(i=0;i<n;i++)

35             ws[wv[i]=x[y[i]]]++;

36         for(i=1;i<m;i++)

37             ws[i]+=ws[i-1];

38         for(i=n-1;i>=0;i--)

39             sa[--ws[wv[i]]]=y[i];

40         for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;i<n;i++)

41             x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;

42     }

43 }

44 void Height(int n)

45 {

46     int i,j,k;

47     for(i=1;i<=n;i++)

48         Rank[sa[i]]=i;

49     for(i=k=0;i<n;height[Rank[i++]]=k)

50         for(k?k--:0,j=sa[Rank[i]-1];s[i+k]==s[j+k];k++);

51 }

52 int main()

53 {

54     int i,c,len;

55     LL ans;

56     scanf("%d",&c);

57     while(c--)

58     {

59         scanf(" %s",s);

60         len=strlen(s);

61         SA(len+1,256);

62         Height(len);

63         ans=0;

64         for(i=1;i<=len;i++)

65             ans+=len-sa[i]-height[i];

66         printf("%lld\n",ans);

67     }

68     return 0;

69 }

你可能感兴趣的:(substring)