不知道为什么写的代码常数巨大,在自己的电脑上面跑了整整10秒钟,如果能给一些有效卡常的文章也行
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
using namespace std;
int n;
string s;
int a[2][2000005];
int sa[1048576];
vector<int> b[1048576],c[1048576];
int main()
{
cin>>s;
n=s.length();
s=' '+s;
for(int i=1;i<=n;i++)
{
if('0'<=s[i]&&s[i]<='9')
a[0][i]=s[i]-'0'+1;
else if('A'<=s[i]&&s[i]<='Z')
a[0][i]=s[i]-'A'+11;
else if('a'<=s[i]&&s[i]<='z')
a[0][i]=s[i]-'a'+37;
}
for(int i=1;i<=n;i++)
c[a[0][i]].push_back(i);
int cnt=0;
for(int i=1;i<=63;i++)
{
if(c[i].size())
cnt++;
for(int j=0;j<c[i].size();j++)
a[0][c[i][j]]=cnt;
}
int p;
for(int i=1;(1<<i)<(n*2);i++)
{
p=i;
for(int j=0;j<=n;j++)
b[j].clear();
for(int j=0;j<=n;j++)
c[j].clear();
for(int j=1;j<=n;j++)
b[a[(i-1)%2][j+(1<<(i-1))]].push_back(j);
for(int j=0;j<=n;j++)
for(int k=0;k<b[j].size();k++)
c[a[(i-1)%2][b[j][k]]].push_back(b[j][k]);
int cnt=0,last=0;
for(int j=0;j<=n;j++)
for(int k=0;k<c[j].size();k++)
{
if(a[(i-1)%2][c[j][k]]!=a[(i-1)%2][last]||a[(i-1)%2][c[j][k]+(1<<(i-1))]!=a[(i-1)%2][last+(1<<(i-1))])
cnt++;
a[i%2][c[j][k]]=cnt;
last=c[j][k];
}
}
for(int i=1;i<=n;i++)
sa[a[p%2][i]]=i;
for(int i=1;i<=n;i++)
cout<<sa[i]<<" ";
return 0;
}