社区讨论

10pts 求卡常

P9196[JOI Open 2016] 销售基因链 / Selling RNA Strands参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhkswula
此快照首次捕获于
2025/11/05 00:46
4 个月前
此快照最后确认于
2025/11/08 07:47
3 个月前
查看原帖
使用 AC 自动机,做法看起来是 O(Li×Σ)O(\sum |L_i| \times |\Sigma|) 的,但是不知道为什么会 TLE
CPP
#include<bits/stdc++.h>
#define endl '\n'
#define N 100006
#define M 5000006
using namespace std;
int n,q,e[N],trans[200];
string s,t,all;
struct ACAM {
	int tot,tr[M][6],fail[M],sum[M];
	int ecnt,head[M],to[M],nxt[M];
	inline void addedge(int u,int v){nxt[++ecnt]=head[u],to[ecnt]=v,head[u]=ecnt;}
	int insert(string s)
	{
		int u=0,ch;
		for(auto c:s)
		{
			ch=trans[c];
			if(!tr[u][ch])tr[u][ch]=++tot;
			u=tr[u][ch];
		}
		return u;
	}
	void build()
	{
		queue<int> q;
		for(int i=0;i<6;i++)
			if(tr[0][i])q.push(tr[0][i]);
		while(q.size())
		{
			int u=q.front(); q.pop();
			for(int i=0;i<6;i++)if(tr[u][i])
				fail[tr[u][i]]=tr[fail[u]][i],q.push(tr[u][i]);
			else tr[u][i]=tr[fail[u]][i];
		}
		for(int i=1;i<=tot;i++)addedge(fail[i],i);
	}
	void dfs(int u){for(int i=head[u];i;i=nxt[i])dfs(to[i]),sum[u]+=sum[to[i]];}
	void add(string s)
	{
		int u=0,ret=0,ch;
		for(auto c:s)
			ch=trans[c],u=tr[u][ch],sum[u]++;
		dfs(0);
	}
}AM;
main()
{
	scanf("%d%d",&n,&q);
	trans['A']=0,trans['G']=1,trans['C']=2,trans['U']=3,trans['?']=4,trans['#']=5;
	for(int i=1;i<=n;i++)cin>>s,all=all+'?'+s+'#'+s;
	for(int i=1;i<=q;i++)
		cin>>s>>t,s=t+'#'+s,e[i]=AM.insert(s);
	AM.build(),AM.add(all);
	for(int i=1;i<=q;i++)printf("%d\n",AM.sum[e[i]]);
	return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...