SAM板子求助,样例全过手模样例全过但交上去全WA
查看原帖
SAM板子求助,样例全过手模样例全过但交上去全WA
50301
PY_Fighter楼主2021/6/7 17:04
#include<cstdio>
#include<algorithm>
#define N 4000005
using namespace std;
int last,cnt,num=0,ans[N];
struct state
{
	int len,link,s,siz;
	int nxt[30];
};
state st[N];
struct node
{
	int val,id;
};
node p[N];
void init()
{
	st[0].len=0;
	st[0].link=-1;
	cnt=last=0;
}
void extend(int c)
{
	int cur=++cnt;
	st[cur].siz=1;
	st[cur].len=st[last].len+1;
	int p=last;
	while (p!=-1&&!st[p].nxt[c])
	{
		st[p].nxt[c]=cur;
		p=st[p].link;
	}
	if (p==-1) st[cur].link=0; else
	{
		int q=st[p].nxt[c];
		if (st[q].len==st[p].len+1) st[cur].link=q; else
		{
			int clone=++cnt;
			st[clone].len=st[p].len+1;
			st[clone].siz=0;
			while (p!=-1&&st[p].nxt[c]==q)
			{
				st[p].nxt[c]=clone;
				p=st[p].link;
			}
			st[q].link=st[cur].link=clone;
		}
	}
	last=cur;
}
bool cmp(node x,node y)
{
	return x.val>y.val;
}
void dfs(int u)
{
	st[u].s=st[u].siz;
	for (int i=0;i<26;i++)
	if (st[u].nxt[i])
	{
		if (!st[st[u].nxt[i]].s) dfs(st[u].nxt[i]);
		st[u].s+=st[st[u].nxt[i]].s;
	}
}
void find(int u,int k)
{
	k-=st[u].siz;
	if (k<=0) return;
	for (int i=0;i<26;i++)
	if (st[u].nxt[i])
	{
		if (k<=st[st[u].nxt[i]].s)
		{
			ans[++num]=i;
			find(st[u].nxt[i],k);
			break;
		}
		k-=st[st[u].nxt[i]].s;
	}
}
int main()
{
	init();
	char ch=getchar();
	while (ch<'a'||ch>'z') ch=getchar();
	while (ch>='a'&&ch<='z')
	{
		extend(ch-'a');
		ch=getchar();
	}
	int t,k;
	scanf("%d%d",&t,&k);
	if (t==1)
	{
		for (int i=1;i<=last;i++)
		{
			p[i].val=st[i].len;
			p[i].id=i;
		}
		sort(p+1,p+last+1,cmp);
		for (int i=1;i<=last;i++)
		st[st[p[i].id].link].siz+=st[p[i].id].siz;
	}
	st[0].siz=0;
	dfs(0);
	if (st[0].s<k) 
	{
		printf("-1\n");
		return 0;
	}
	find(0,k);
	for (int i=1;i<=num;i++)
	printf("%c",ans[i]+'a');
	puts("");
	return 0;
}

蒟蒻萌新实在调不出来了qwq

嘤嘤嘤

2021/6/7 17:04
加载中...