SAM TLE 10pts 求助/dk
查看原帖
SAM TLE 10pts 求助/dk
203008
山田リョウ楼主2022/6/23 22:45
// Problem: P3975 [TJOI2015]弦论
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3975
// Memory Limit: 250 MB
// Time Limit: 1000 ms

#include<stdio.h>
#include<map>
struct{
	int fail,len,cnt;
	std::map<char,int>ch;
}node[1000000];
int tot,last,sum[1000000];
inline void init(){node[last=0].fail=-1,node[0].len=0,tot=1;}
inline void insert(char c){
	int p=last,cur=tot++;
	for(node[cur].len=node[p].len+1,node[cur].cnt=1;(~p)&&!node[p].ch[c];p=node[p].fail)node[p].ch[c]=cur;
	if(~p){
		int q=node[p].ch[c];
		if(node[p].len+1==node[q].len)node[cur].fail=q;
		else{
			int clone=tot++;
			node[clone]={node[q].fail,node[p].len+1,0,node[q].ch},node[q].fail=node[cur].fail=clone;
			for(;(~p)&&node[p].ch[c]==q;p=node[p].fail)node[p].ch[c]=clone;
		}
	}else node[cur].fail=0;
	last=cur;
}
void topo(){
	static int q[1000000],deg[1000000];
	int l=0,r=0;
	for(int i=1;i<tot;++i)++deg[node[i].fail];
	for(int i=0;i<tot;++i)if(!deg[i])q[r++]=i;
	for(;l<r;++l)
		if(!(node[node[q[l]].fail].cnt+=node[q[l]].cnt,--deg[node[q[l]].fail]))
			q[r++]=node[q[l]].fail;
	node[0].cnt=0;
}
void dfs(int u){
	sum[u]=node[u].cnt;
	for(const auto&v:node[u].ch)
		dfs(v.second),sum[u]+=sum[v.second];
}
void print(int u,int k){
	if(k<=node[u].cnt)return;
	k-=node[u].cnt;
	for(const auto&v:node[u].ch){
		if(k<=sum[v.second])return putchar(v.first),print(v.second,k);
		k-=sum[v.second];
	}
}
int main(){
	init();
	for(char c=getchar();'a'<=c&&c<='z';c=getchar())insert(c);
	int type,k;
	scanf("%d%d",&type,&k);
	if(type)topo();
	else for(int i=1;i<tot;++i)node[i].cnt=1;
	dfs(0);
	if(k>sum[0])puts("-1");
	else print(0,k);
	return 0;
}
2022/6/23 22:45
加载中...