本文共 1691 字,大约阅读时间需要 5 分钟。
做出公差后找出最长不重叠子序列的长度。
后缀数组的模板, 二分长度k然后将height数组分组, 判断每一组内sa的最大值-sa的最小值是否大于等于k, 如果大于等于k则满足。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 using namespace std; 14 #define pb(x) push_back(x) 15 #define ll long long 16 #define mk(x, y) make_pair(x, y) 17 #define lson l, m, rt<<1 18 #define mem(a) memset(a, 0, sizeof(a)) 19 #define rson m+1, r, rt<<1|1 20 #define mem1(a) memset(a, -1, sizeof(a)) 21 #define mem2(a) memset(a, 0x3f, sizeof(a)) 22 #define rep(i, n, a) for(int i = a; i pll; 26 const double PI = acos(-1.0); 27 const double eps = 1e-8; 28 const int mod = 1e9+7; 29 const int inf = 1061109567; 30 const int dir[][2] = { {-1, 0}, { 1, 0}, { 0, -1}, { 0, 1} }; 31 const int maxn = 2e4+5; 32 int sa[maxn]; 33 int t1[maxn],t2[maxn],c[maxn], a[maxn]; 34 int rankk[maxn],height[maxn]; 35 void build_sa(int s[],int n,int m) 36 { 37 int i,j,p,*x=t1,*y=t2; 38 for(i=0;i =0;i--)sa[--c[x[i]]]=i; 42 for(j=1;j<=n;j<<=1) 43 { 44 p=0; 45 for(i=n-j;i =j)y[p++]=sa[i]-j; 47 for(i=0;i =0;i--)sa[--c[x[y[i]]]]=y[i]; 51 swap(x,y); 52 p=1;x[sa[0]]=0; 53 for(i=1;i =n)break; 56 m=p; 57 } 58 } 59 void getHeight(int s[],int n) 60 { 61 int i,j,k=0; 62 for(i=0;i<=n;i++)rankk[sa[i]]=i; 63 for(i=0;i mid) 80 return 1; 81 } 82 } 83 return 0; 84 } 85 int main() 86 { 87 int n, m; 88 while(cin>>n&&n) { 89 for(int i = 0; i >1;100 if(!check(mid, n)) {101 r = mid-1;102 } else {103 l = mid+1;104 }105 }106 if(l<5) {107 l = 0;108 }109 cout< <
转载于:https://www.cnblogs.com/yohaha/p/5097464.html