萌新刚学oi被卡常求助
查看原帖
萌新刚学oi被卡常求助
912241
dream_on_screen楼主2024/8/27 21:09

不知道为什么写的代码常数巨大,在自己的电脑上面跑了整整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;
}
2024/8/27 21:09
加载中...