洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

思路大概和其他的题解一样:

从当前字符串最前面,最后面选一个字典序较小的然后拉到一个新的字符串序列中,如果相同就一直往中间扫描直到发现不同为止(一个字符如果被选中之后那么就不可以再次选择了),所以我们左右各设一个指针扫描就好了,不需要递归。 —— WuPengrui_666

此题解终结……诶等一下!84分是怎么回事!

哦,对了,数据被加强了

毒瘤chen_zhe

这里的题解都比较古老……都在数据被增强之前写的

那……我们谈一下正(you)确(hua)解(bao)法(li)

朴素暴力最坏可以达到(O(n^2)),就是全部都是同一个字符的情况

对于这种情况,我们只需特判。因为只有一个字符,取出的字串也就只有一种可能,于是我们直接输出这n个字符不就好了呢~

code :

#include <bits/stdc++.h>

using namespace std;

int main() {
    int cnt = 0, l = 1, r, n, flag = 1;
    scanf("%d", &n);
    char a[500010], c;
    for(int i = 1; i <= n; i++) {
        getchar(); a[i] = getchar();
        if(i == 1) c = a[i];
        else if(a[i] != c) flag = 0;
    }
    if(flag) {
        for(int i = 1; i <= n; i++) {
            putchar(c);
            if(i % 80 == 0) putchar(10);
        }
        return 0;
    }
    r = n;
    while(l < r) {
        cnt++;
        if(a[l] < a[r]) {
            putchar(a[l]);
            l++;
        } else {
            if(a[r] < a[l]) {
                putchar(a[r]);
                r--;
            } else {
                int x = l, y = r;
                while(x < y && a[x] == a[y]) x++, y--;
                if(a[x] < a[y]) {
                    putchar(a[l]);
                    l++;
                } else {
                    putchar(a[r]);
                    r--;
                }
            }
        }
        if(cnt % 80 == 0) putchar(10);
    }
    putchar(a[l]);
    return 0;
}

此题解终结(真的)



原文地址:https://www.cnblogs.com/iycc/p/10329049.html