Advertisement
Morass

Spring

Sep 9th, 2016
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.09 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<29)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<ll,ll> pll;
  13. typedef vector<int> vi;
  14. typedef pair<int,int> ii;
  15. typedef vector<ii> vii;
  16. #define IN(n) int n;scanf("%d",&n);
  17. #define FOR(i, m, n) for (int i(m); i < n; i++)
  18. #define REP(i, n) FOR(i, 0, n)
  19. #define F(n) REP(i, n)
  20. #define FF(n) REP(j, n)
  21. #define FT(m, n) FOR(k, m, n)
  22. #define aa first
  23. #define bb second
  24. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  25. #define MX (1<<19)
  26. typedef unsigned char uc;  
  27. uc M[]={128,64,32,16,8,4,2,1};
  28. #define SI (sizeof(int))
  29. #define tg(i) ((t[(i)>>3]&M[(i)&7])?1:0)
  30. #define ts(i, b) t[(i)>>3]=(b) ? (M[(i)&7]|t[(i)>>3]):((~M[(i)&7])&t[(i)>>3])
  31. #define chr(i) (cs==SI?((int*)s)[i]:((uc*)s)[i])
  32. #define lms(i) (i>0&&tg(i)&&!tg(i-1))
  33. void buc(uc *s,int *b,int n,int K,int cs,bool e){
  34.     int S(0);
  35.     F(K+1)b[i]=0;
  36.     F(n)++b[chr(i)];
  37.     F(K+1)S+=b[i],b[i]=e?S:S-b[i];
  38. }
  39. void isa(uc*t,int*SA,uc*s,int*b,int n,int K,int cs,bool e){
  40.     int j;
  41.     buc(s,b,n,K,cs,e);
  42.     F(n)if((j=SA[i]-1)>=0&&!tg(j))
  43.         SA[b[chr(j)]++]=j;
  44. }
  45. void sas(uc*t,int*SA,uc*s,int*b,int n,int K,int cs,bool e){
  46.     int j;
  47.     buc(s,b,n,K,cs,e);
  48.     for(int i(n-1);~i;--i)
  49.         if((j=SA[i]-1)>=0&&tg(j))
  50.             SA[--b[chr(j)]]=j;
  51. }
  52. void sa(uc*s,int*SA,int n,int K=256,int cs=1){
  53.     static int b[MX];
  54.     int j,n1(0),h(0),w(-1),p,f;
  55.     uc *t=(uc*)malloc(n>>3|1);
  56.     ts(n-2,0),ts(n-1,1);
  57.     for(int i(n-3);~i;--i)
  58.         ts(i,(chr(i)<chr(i+1)||(chr(i)==chr(i+1)&&tg(i+1)==1))?1:0);
  59.     buc(s,b,n,K,cs,1);
  60.     F(n)SA[i] = -1;
  61.     FT(1,n)if(lms(k))SA[--b[chr(k)]]=k;
  62.     isa(t,SA,s,b,n,K,cs,0);
  63.     sas(t,SA,s,b,n,K,cs,1);
  64.     F(n)if(lms(SA[i]))SA[n1++]=SA[i];
  65.     FT(n1,n)SA[k]=-1;
  66.     F(n1){
  67.         p=SA[i],f=0;
  68.         F(n)if(!~w||chr(p+i)!=chr(w+i)||tg(p+i)!=tg(w+i))f=1,i=n;
  69.             else if(i>0&&(lms(p+i)||lms(w+i)))break;
  70.         if(f)++h,w=p;
  71.         p>>=1,SA[n1+p]=h-1;
  72.     }
  73.     for(int i(n-1),j(n-1);i>=n1;--i)
  74.         if(SA[i]>=0)SA[j--]=SA[i];
  75.     int *SA1=SA,*s1=SA+n-n1;
  76.     if(h<n1)sa((uc*)s1,SA1,n1,h-1,SI);
  77.     else F(n1)SA1[s1[i]]=i;
  78.     buc(s,b,n,K,cs,1);
  79.     j=0;FT(1,n)if(lms(k))s1[j++]=k;
  80.     F(n1)SA1[i]=s1[SA1[i]];
  81.     FT(n1,n)SA[k]=-1;
  82.     for(int i(n1-1);~i;--i)
  83.         j=SA[i],SA[i]=-1,SA[--b[chr(j)]]=j;
  84.     isa(t,SA,s,b,n,K,cs,0),sas(t,SA,s,b,n,K,cs,1);
  85.     free(t);
  86. }
  87. void lcp(int *sa,int *lcp,int n,uc *s){
  88.     static int r[MX];
  89.     F(n)r[sa[i]]=i,lcp[i]=0;;
  90.     int h(0);F(n)if(r[i]<n-1){
  91.         for(int j(sa[r[i]+1]);s[i+h]==s[j+h];++h);
  92.         lcp[r[i]]=h;
  93.         if(h)--h;
  94.     }
  95. }
  96. uc s[MX];
  97. int N,K,O,C[MX],SA[MX],S;
  98. int main(void){
  99.     IN(tt)F(tt){
  100.         assert(scanf("%d%d%s",&N,&K,s)==3),assert(K<=N&&K>=0&&N<=1e5),O+=N;
  101.         sa(s,SA,N+1),lcp(SA,C,N+1,s),S=0;
  102.         F(N+1)S+=SA[i]<=N-K&&C[i]<K;
  103.         printf("%d\n",S);
  104.     }
  105.     assert(O<=3e5);
  106.     return 0;
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement