zoukankan      html  css  js  c++  java
  • Luogu P2852 [USACO06DEC]牛奶模式Milk Patterns

    题目链接 (Click) (Here)

    水题。利用(Height)的性质维护一个单调栈即可。

    #include <bits/stdc++.h>
    using namespace std;
    
    #define LL long long
    const int N = 1000010;
    
    int n, m = 1000000, q, s[N], sa[N], tp[N];
    int rk[N], _rk[N], bin[N], height[N];
    
    void base_sort () {
        for (int i = 0; i <= m; ++i) bin[i] = 0;
        for (int i = 1; i <= n; ++i) bin[rk[tp[i]]]++;
        for (int i = 1; i <= m; ++i) bin[i] += bin[i - 1];
        for (int i = n; i >= 1; --i) sa[bin[rk[tp[i]]]--] = tp[i];
    }
    
    void suffix_sort () {
        for (int i = 1; i <= n; ++i) {
            tp[i] = i;
            rk[i] = s[i];
        }
        base_sort ();
        for (int w = 1; w <= n; w <<= 1) {
            int cnt = 0;
            for (int i = n - w + 1; i <= n; ++i) {
                tp[++cnt] = i;
            }
            for (int i = 1; i <= n; ++i) {
                if (sa[i] > w) {
                    tp[++cnt] = sa[i] - w;
                }
            }
            base_sort ();
            memcpy (_rk, rk, sizeof (rk));
            rk[sa[1]] = cnt = 1;
            for (int i = 2; i <= n; ++i) {
                rk[sa[i]] = _rk[sa[i]] == _rk[sa[i - 1]] && _rk[sa[i] + w] == _rk[sa[i - 1] + w] ? cnt : ++cnt;
            }
            if (cnt == n) break;
            m = cnt;
        }
        // printf ("sa : ");for (int i = 1; i <= n; ++i) printf ("%d ", sa[i]); printf ("
    ");
    }
    
    void get_height () {
        int k = 0;
        for (int i = 1; i <= n; ++i) {
            if (k) k--;
            int j = sa[rk[i] - 1];
            while (s[i + k] == s[j + k]) ++k;
            height[rk[i]] = k; 
        }
        // printf ("height : ");
        // for (int i = 1; i <= n; ++i) {
        // 	printf ("%d ", height[i]);
        // }
        // printf ("
    ");
    }
    
    int que[N];
    
    int main () {
    	cin >> n >> q;
    	for (int i = 1; i <= n; ++i) {
    	    cin >> s[i];
    	}
        suffix_sort ();
        get_height ();
    	int head = 1, tail = 0, ans = -0x3f3f3f3f;
    	for (int i = 1; i <= n; ++i) {
    		while (head <= tail && height[que[tail]] >= height[i]) --tail;
    		que[++tail] = i;
    		while (head <= tail && i - que[head] >= q - 1) ++head;
    		ans = max (ans, height[que[head]]);
    	}
    	cout << ans << endl;
    }
    
    
  • 相关阅读:
    结对项目之感
    调查问卷之体会
    我的软件工程课程目标
    关于软件工程的课程建议
    结对编程--fault,error,failure
    结对编程总结
    结对编码感想
    我的软件工程课目标
    《软件工程》课之-调查问卷的心得体会
    软件工程课程讨论记录
  • 原文地址:https://www.cnblogs.com/maomao9173/p/10437007.html
Copyright © 2011-2022 走看看