#include #include #include #include using namespace std; #define MAXN 200100 int dp[MAXN][20]; char r[MAXN]; int sa[MAXN]; int wa[MAXN],wb[MAXN],wv[MAXN],ws[MAXN]; int height[MAXN],rk[MAXN]; int mm[MAXN]; int cas; inline bool cmp(int *r,int a,int b,int len){ return r[a]==r[b]&&r[a+len]==r[b+len]; } void SA(int n,int m){ int i,j,p,*x=wa,*y=wb,*t; for(i=0;i=0;i--) sa[--ws[x[i]]]=i; for(j=p=1;p=j) y[p++]=sa[i]-j; } for(i=0;i=0;i--) sa[--ws[wv[i]]]=y[i]; for(t=x,x=y,y=t,x[sa[0]]=0,p=i=1;iq) dp[i][j]=dp[i+(1<<(j-1))][j-1]; else dp[i][j]=dp[i][j-1]; } } int RMQ_MIN(int i,int j){ int tem; if(i>j){ tem=i; i=j; j=tem; } i++; int k=mm[(j-i+1)]; return min(height[dp[i][k]],height[dp[j-(1<pre1){ ans+=j-pre1; pre1=j; } pre2=min(pre2,height[i]); j=RMQ_MIN(i,rk[n-sa[i]]); if(j>pre2){ ans+=j-pre2; pre2=j; } } printf("Case #%d: %d\n",cas,ans); } int main(){ int i,j,n,t,T; mm[0]=-1; for(i=1;i