【bzoj 1692】【bzoj 1640】【poj 3617】【poj 3623】Best Cow Line 好牛队 双倍经验水水水

这破题虐了我一晚上……
读完题就正解了……
一晚上没调出来……
猜猜怎么回事……
我现在仍然在被DQS学长嘲笑……
QAQ……
DQS学长花了五分钟打出来了……
打出来了……
我我我我我我我……
QAQ……
大神为何要虐蒟蒻……

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std;
const int MAXN = 100000 + 5;
int n,k;
int tot;
int sa[MAXN],rank[MAXN],tmp[MAXN];
bool cmp_sa(int a,int b)
{
    if(rank[a] != rank[b])
        return rank[a] < rank[b];
    else
    {
        int x = a + k <= n ? rank[a + k] : -1;
        int y = b + k <= n ? rank[b + k] : -1;
        return x < y;
    }
}
void make_sa(char s[])
{
    for(int i = 0;i <= n;i ++)
    {
        rank[i] = i < n ? s[i] : -1;
        sa[i] = i;
    }
    for(k = 1;k <= n;k <<= 1)
    {
        sort(sa,sa + n + 1,cmp_sa);
        tmp[sa[0]] = 0;
        for(int i = 1;i <= n;i ++)
            tmp[sa[i]] = tmp[sa[i - 1]] + cmp_sa(sa[i - 1],sa[i]);
        for(int i = 0;i <= n;i ++)
            rank[i] = tmp[i];
    }
    return;
}
char s[MAXN];
int main()
{
    scanf("%d",&n);
    int l = 0,r = n - 1;
    for(int i = 0;i < n;i ++)
    {
        char c = getchar();
        while(!isalpha(c))
            c = getchar();
        s[i] = c;
    }
    s[n] = 0;
    for(int i = 1;i <= n;i ++)
        s[n + i] = s[n - i];
    n <<= 1;
    make_sa(s);
    while(l <= r)
    {
        if(s[l] < s[r])//注意这里不是rank!!!!!!别问我为啥调一晚上!!!
        {
            putchar(s[l++]);
        }
        else if(s[l] > s[r])
        {
            putchar(s[r--]);
        }
        else
        {
            if(rank[l] < rank[n - r])
                putchar(s[l ++]);
            else
                putchar(s[r --]);
        }
        tot++;
        if(tot == 80)
            tot = 0,puts("");
    }
    return 0;
}
/*
eabbe
*/
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页