为什么不管怎么交都RE,心态爆炸
查看原帖
为什么不管怎么交都RE,心态爆炸
484332
NOIer楼主2024/1/1 18:18
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3000011;
char str[N];
ll f[N],sz[N];
int t,k;
struct SAM{
	int ch[28],len,fa;
}s[N];

int first[N],idx;
struct edge{
	int ne,d;
}ed[N];
void add_edge(int e,int d){
	idx++,ed[idx].d=d,ed[idx].ne=first[e],first[e]=idx;
}

int tot=1,lst=1;
void insert(int x){			
	int p,np;
	p=lst,np=lst=++tot;
	s[np].len=s[p].len+1;
	sz[lst]=f[lst]=1;
	for(;p&&!s[p].ch[x];p=s[p].fa) s[p].ch[x]=np;
	if(!p) s[np].fa=1;
	else{
		int q=s[p].ch[x];
		if(s[q].len==s[p].len+1) s[np].fa=q;
		else{
			int nq=++tot;
			s[nq]=s[q];
			s[nq].len=s[p].len+1;
			s[q].fa=s[np].fa=nq;
			for(;p&&s[p].ch[x]==q;p=s[p].fa) s[p].ch[x]=nq;
		}
	}
}

void dfs1(int x){
	for(int i=first[x];i;i=ed[i].ne){
		int d=ed[i].d;
		if(!d) continue;
		dfs1(d);
		sz[x]+=sz[d];
	}
	f[x]=sz[x];
}
bool vis[N];
ll dfs2(int x){
	if(vis[x]) return f[x];
	vis[x]=true;
	for(int i=0;i<26;i++){
		int d=s[x].ch[i];	
		if(d) f[x]+=dfs2(d);
	}
	return f[x];
}

void print(int x,int k){
	if(k>f[k]){
		puts("-1");
		return ;
	}
	if(k<=sz[x]) return ;
	k-=sz[x];
	for(int i=0;i<26;i++){
		int d=s[x].ch[i];
//		cout<<d<<k<<f[d];
		if(k>f[d]) k-=f[d];
		else{
			printf("%c",'a'+i);
			print(d,k);
			return ;
		}
	}
}

int main()
{
	scanf("%s",str+1);
	int len=strlen(str+1);
	for(int i=1;i<=len;i++) insert(str[i]-'a');
	for(int i=1;i<=tot;i++) if(s[i].fa) add_edge(s[i].fa,i);//注意判断条件  
	cin>>t>>k;
	if(!t) for(int i=1;i<=tot;i++) sz[i]=f[i]=1;
	else dfs1(1);
	f[1]=sz[1]=0;
	dfs2(1);
	print(1,k);
	return 0;
 } 
2024/1/1 18:18
加载中...