一样的题,为什么CF上能过,洛谷上过不了
查看原帖
一样的题,为什么CF上能过,洛谷上过不了
203083
炎炎龙虾楼主2020/7/13 20:20

明明是一模一样的题,时限也一样,为什么CF上AC了,洛谷上却TLE了,再说,这个算法的时间复杂度不是O(nlog2n)O(nlog^2n)吗?

//
// Created by admin on 2020/7/13.
//
#include <bits/stdc++.h>
using namespace std;
string s;
int k=0,n;
int main()
{
    getline(cin,s);
    s+='$';
    n=s.size();
    vector<int>p(n),c(n);  //p为后缀排序结果,c为字符串所处集合
    {//k=0时,即初始化
        vector<pair<char,int>>a(n);  //a为第一元为后缀起始字符,第二元为起始字符下标
        for (int i = 0; i < n; ++i) {
            a[i]={s[i],i};
        }
        sort(a.begin(),a.end());  //排序
        for (int i = 0; i < n; ++i) {
            p[i]=a[i].second;
        }
        c[p[0]]=0;
        for (int i = 1; i < n; ++i) {
            if(a[i].first==a[i-1].first)  //两字符串的起始字符相同,在此地位相等
                c[p[i]]=c[p[i-1]];
            else
                c[p[i]]=c[p[i-1]]+1;
        }
    }
    while ((1<<k)<n)  //k到k+1的过渡
    {
        vector<pair<pair<int,int>,int> > a(n);
        for (int i = 0; i < n; ++i) {
            a[i].first={c[i],c[(i+(1<<k)) %n]};
            a[i].second=i;
        }
        sort(a.begin(),a.end());
        for (int i = 0; i < n; ++i) {
            p[i]=a[i].second;
        }
        c[p[0]]=0;
        for (int i = 1; i < n; ++i) {
            if(a[i].first==a[i-1].first)  //两字符串的起始字符相同,在此地位相等
                c[p[i]]=c[p[i-1]];
            else
                c[p[i]]=c[p[i-1]]+1;
        }
        k++;
    }
    for (int i = 0; i < n; ++i) {
        if(p[i]!=n-1)
            printf("%d ",p[i]+1);
    }
    puts("");
    return 0;
}

2020/7/13 20:20
加载中...