首页 > 其他分享 >【XSY3458】原样输出(SAM)

【XSY3458】原样输出(SAM)

时间:2022-10-30 12:35:17浏览次数:45  
标签:XSY3458 ch NN SAM fa 原样 len int nq

考虑判断一个串是否能成为输出,贪心的方法肯定是优先在第一个串的 SAM 上匹配至匹配不了,再在第二个串的 SAM 上匹配至匹配不了,……

于是可以考虑通过如下方式把 \(n\) 个串的 SAM 拼起来:

如果一个点没有 \(C\) 的转移边,那么就要向之后第一个包含字符 \(C\) 的字符串的后缀自动机接受字符串 \(C\) 的节点连一条 \(C\) 的转移边。

然后询问就是拓扑排序 DP(type=0)和暴力 dfs(type=1)。

#include<bits/stdc++.h>

#define N 3000010
#define NN 6000010
#define re register

using namespace std;

int n;
int cid[26];
int nrt,lst,node,ch[NN][4],len[NN],fa[NN];
bool root[NN];
char str[N];
char idc[4];

void insert(int c)
{
	int p=lst,now=lst=++node;
	len[now]=len[p]+1;
	for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=now;
	if(!p) fa[now]=nrt;
	else
	{
		int q=ch[p][c];
		if(len[q]==len[p]+1) fa[now]=q;
		else
		{
			int nq=++node;
			memcpy(ch[nq],ch[q],sizeof(ch[nq]));
			len[nq]=len[p]+1;
			fa[nq]=fa[q],fa[q]=nq;
			fa[now]=nq;
			for(;p&&ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
		}
	}
}

void build()
{
	nrt=lst=++node;
	root[nrt]=1;
	for(int i=1,len=strlen(str+1);i<=len;i++)
		insert(cid[str[i]-'A']);
}

void work()
{
	int nxtrt=-1;
	for(int i=node;i>=1;i--)
	{
		if(nxtrt!=-1)
		{
			for(int c=0;c<4;c++)
				if(!ch[i][c]) ch[i][c]=ch[nxtrt][c];
		}
		if(root[i]) nxtrt=i;
	}
}

namespace sub0
{
	namespace modular
	{
		const int mod=1000000007;
		inline void Add(int &x,int y){x=x+y>=mod?x+y-mod:x+y;}
	}using namespace modular;
	bool vis[NN];
	int d[NN],f[NN];
	queue<int>q;
	void dfs(int u)
	{
		vis[u]=1;
		for(int c=0;c<4;c++)
		{
			if(ch[u][c])
			{
				d[ch[u][c]]++;
				if(!vis[ch[u][c]]) dfs(ch[u][c]);
			}
		}
	}
	void main()
	{
		dfs(1);
		q.push(1);
		f[1]=1;
		int ans=0;
		while(!q.empty())
		{
			int u=q.front();
			q.pop();
			Add(ans,f[u]);
			for(int c=0;c<4;c++)
			{
				if(ch[u][c])
				{
					d[ch[u][c]]--;
					Add(f[ch[u][c]],f[u]);
					if(!d[ch[u][c]]) q.push(ch[u][c]);
				}
			}
		}
		printf("%d\n",ans);
	}
}

namespace sub1
{
	int ans;
	int len;
	int top;
	char now[N],out[10000000];
	void dfs(int u)
	{
		ans++;
		now[len+1]='\n';
		for(int i=1;i<=len+1;i++) out[++top]=now[i];
		if(top>=5000000)
		{
			fwrite(out+1,top,sizeof(char),stdout);
			top=0;
		}
		len++;
		for(int c=0;c<4;c++)
		{
			if(ch[u][c])
			{
				now[len]=idc[c];
				dfs(ch[u][c]);
			}
		}
		len--;
	}
	void main()
	{
		dfs(1);
		if(top) fwrite(out+1,top,sizeof(char),stdout);
		printf("%d\n",ans);
	}
}

int main()
{
	cid['A'-'A']=0,cid['C'-'A']=1,cid['G'-'A']=2,cid['T'-'A']=3;
	idc[0]='A',idc[1]='C',idc[2]='G',idc[3]='T';
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",str+1);
		build();
	}
	work();
	int k;
	scanf("%d",&k);
	if(k) sub1::main();
	else sub0::main();
	return 0;
}

标签:XSY3458,ch,NN,SAM,fa,原样,len,int,nq
From: https://www.cnblogs.com/ez-lcw/p/16840980.html

相关文章

  • not_the_same_3dsctf_2016
    【Write-up】BUUCTFnot_the_same_3dsctf_2016原题链接【Write-up】BUUCTFnot_the_same_3dsctf_2016checksec查看程序架构ida查看程序伪代码构建exp完整exp......
  • FFmpeg问题:more samples than frame size
    1、问题描述:写文件的时候,编码器的frame_size比输入帧的nb_samples小,导致如下图所示问题2、尝试解决(失败)显示修改编码器的frame_size属性,失败原因:打开编码器(即......
  • 配置与管理Samba服务器
    一、认识Samba1、Samba应用环境:文件和打印机共享、身份验证和权限设置、名称解析、浏览服务2、了解SMB协议:SMB(ServerMessageBlock)通信协议可以看作是局域网上共享文......
  • 解决新版chrome浏览器SameSite属性cookie拦截问题
    问题现象:由于升级了新版chrome浏览器后,发现系统正常iframe嵌套、AJAX,Image从以前的跨站会发送三方Cookie,变成了不发送。导致某些内容无法显示了,页面空白,但是请求未报错。......
  • Cannot create graph: graph with the same name "PORT_LISTEN_STATUS" already exist
    解决办法,后面加上{#TCP_PORT}:......
  • Linux SAMBA 服务-cifs文件系统的挂载
    相关概念SMB:  ServerMessageBlock服务器消息块,属于微软的私有协议,是windws之间相互共享资源的一种协议。cifs:  commoninternetfilesystem,基于smb开发而来的......
  • Mysql索引原理揭秘之——MyISAM和InnoDB
    MyISAM引擎的索引实现在MyISAM里面,另外有两个文件,一个是.MYD文件,D代表Data,是MyISAM的数据文件,存放数据记录,比如我们的user_myisam表的所有的表数据;一个是.MYI文件,I代表Inde......
  • Linux搭建samba服务
    Linux搭建samba服务实现文件共享实现方式,首先需要配置yum。需要配置可以根据此链接进行配置:https://www.cnblogs.com/cherish-sweet/p/newyum.html 1. 检查是否安装......
  • samba
    目录快速开始配置文件解析globalother快速开始第一步:安装sambayuminstallsambasamba-commonsamba-client-ycat/etc/samba/smb.conf[global]workgroup......
  • 树莓派4b部署samba服务实现文件共享
    注意samba生命力很旺盛,软件是在不断更新的,网上很多针对samba网速优化设置截止当前实测发现有很多已经过期,甚至有些设置会适得其反,使传输速度更低。例如,全网都......