明明是一模一样的题,时限也一样,为什么CF上AC了,洛谷上却TLE了,再说,这个算法的时间复杂度不是O(nlog2n)吗?
//
// 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;
}