社区讨论
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 自动机,做法看起来是 的,但是不知道为什么会 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 条回复,欢迎继续交流。
正在加载回复...