Test instructions: give you two strings. To find the length of the longest common string.
by : Luo Spike Qian Template
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm>using namespace STD; #define M 303#define inf 0x3fffffff#define maxn 500000#define ws ww#define rank rank#define F (x) ((x)/3+ ((x)%3==1?0:TB )) #define G (x) ((x) <TB?(x) *3+1: ((x)-TB) *3+2) int wa[maxn],wb[maxn],wv[maxn],ws[maxn];int r[maxn],sa[maxn];int cmp (int *r,int a,int b,int l) { return r[a]==r[b]&&r[a+l]==r[b+l];} void da (int *r,int *sa,int n,int m) {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]=r [I]] ++; for (i=1;i<m;i++) ws[i]+=ws[i-1]; for (i=n-1;i>=0;i--) sa[--ws[x[i]]]=i; for (j=1,p=1;p<n;j*=2,m=p) {for (p=0,i=n-j;i<n;i++) y[p++]=i, for (i=0;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]- J for (i=0;i<n;i++) wv[i]=x[y[i]]; for (i=0;i<m;i++) ws[i]=0; for (i=0;i<n;i++) ws[wv[i]]++; for (i=1;i<m;i++) ws[i]+=ws[i-1]; for (i=n-1;i>=0;i--) sa[--ws[wv[i]]]=y[i]; for (t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1;i<n;i++) x[sa[i]]=cmp (y,sa[i-1],sa[i],j)? p-1:p++; } return; }int rank[maxn],height[maxn];void calheight (int *r,int *sa,int n) {int i,j,k=0;for (i=1;i<=n;i++) rank[sa[i]]=i;for ( i=0;i<n;height[rank[i++]]=k) for (k?k--:0,j=sa[rank[i]-1];r[i+k]==r[j+k];k++); return;} Char Str[maxn];int main () {gets (str);int Len1;len1=strlen (str); str[len1]= ' $ '; gets (str+len1+1); int Len=strlen (str); for (int i=0;i<len;i++) R[i]=str[i] ;d A (r,sa,len+1,128); Calheight (r,sa,len); int ans=0;for (int i=1;i<len;i++) {if (Sa[i-1]<len1&&sa[i] >=LEN1) | | (SA[I-1]>=LEN1&&SA[I]<LEN1)) Ans=max (Ans,height[i]);} printf ("%d\n", ans); return 0;}
PKU 2774 Long long Message (suffix array practice template title)