SAM求调
查看原帖
SAM求调
167279
Danno0v0楼主2022/11/3 10:56

恶补字符串然后全WA

样例都过了手玩几组自造的也过了……

#include<bits/stdc++.h>
#define Max 4000001
#define int long long
using namespace std;
struct node
{
	int son[26];
	int len,fa;
}SAM[Max];
int cnt=1,las=1;
int fi[Max],to[Max],nx[Max],tot,val[Max],dp[Max];
int in[Max];
void link(int a,int b)
{
	nx[++tot]=fi[a];
	fi[a]=tot;
	to[tot]=b;
}
void add(int c)
{
	int p=las,np=las=++cnt;val[cnt]=1;
	SAM[np].len=SAM[p].len+1;
	for(;p&&!SAM[p].son[c];p=SAM[p].fa) SAM[p].son[c]=np;
	if(!p) SAM[np].fa=1;
	else
	{
		int q=SAM[p].son[c];
		if(SAM[q].len==SAM[p].len+1) SAM[np].fa=q;
		else
		{
			int nq=++cnt;
			SAM[nq]=SAM[q],SAM[nq].len=SAM[p].len+1,SAM[q].fa=SAM[np].fa=nq;
			for(;p&&SAM[p].son[c]==q;p=SAM[p].fa) SAM[p].son[c]=nq;
		}
	}
}
void dfs(int x)
{
	for(int i=fi[x];i;i=nx[i])
	{
		int v=to[i];
		dfs(v);
		val[x]+=val[v];
	}
}
void work(int x,int k)
{
	if(k<=val[x]) return;
	k-=val[x];
	for(int i=0;i<26;i++) 
		if(SAM[x].son[i])
		{
			if(k>dp[SAM[x].son[i]]) k-=dp[SAM[x].son[i]];
			else
			{
				cout<<(char)(i+'a');
				work(SAM[x].son[i],k);
				return;		
			}
		}
}
signed main()
{
	int k,typ;
	string p;
	cin>>p;
	for(int i=0;i<p.size();i++)
		add(p[i]-'a');
	cin>>typ>>k;
	for(int i=2;i<=cnt;i++)
		link(SAM[i].fa,i);
	dfs(1);	
	for(int i=1;i<=cnt;i++) !typ?dp[i]=val[i]=1:dp[i]=val[i];
	dp[1]=val[1]=0;
	for(int i=cnt;i>=1;i--)
		for(int x=0;x<26;x++)
			if(SAM[i].son[x])
				dp[i]+=dp[SAM[i].son[x]];
	int now=1;
	if(dp[1]<k) cout<<-1;
	else work(1,k);
}
/*
dcbaabcd
1 4
*/
2022/11/3 10:56
加载中...