P9196 [JOI Open 2016] 销售基因链 / Selling RNA Strands 题解

P9196 JOI Open 2016 销售基因链 / Selling RNA Strands 题解

思路

考虑映射,将基因库的字符串 SiS_iSi 映射成 Si#SiS_i\#S_iSi#Si 的形式,对于询问 P,QP,QP,Q 映射成 Q#PQ\#PQ#P 的形式,那么就相当于问每个询问串在基因库中出现的次数,直接跑 AC 自动机多模匹配即可。

代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int ch[5000010][5],ed[5000010],fail[5000010],c[255],id;
int ip[100010];
void ins(string s,int x){
	int p=0;
	for(int i=0;i<s.size();i++){
		int j=c[s[i]];
		if(!ch[p][j])ch[p][j]=++id;
		p=ch[p][j];
	}
	ip[x]=p;
}
int q[4100010],l=1,r;
void build(){
	for(int i=0;i<5;i++)if(ch[0][i])q[++r]=ch[0][i];
	while(l<=r){
		int x=q[l++];
		for(int i=0;i<5;i++){
			int &y=ch[x][i];
			if(!y)y=ch[fail[x]][i];
			else fail[y]=ch[fail[x]][i],q[++r]=y;
		}
	}
}
vector<int> G[5000010];
void query(string s){
	int p=0;
	for(int i=0;i<s.size();i++){
		int j=c[s[i]];
		p=ch[p][j];
		ed[p]++;
	}
}
void dfs(int x){
	for(int y:G[x]){
		dfs(y);
		ed[x]+=ed[y];
	}
}
string s[100010];
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	c['A']=0;c['G']=1;c['U']=2;c['C']=3;c['#']=4;
	int q;
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>s[i];
		s[i]=s[i]+"#"+s[i];//字符串映射
	}
	dfs(0);
	for(int i=1;i<=q;i++){
		string s,t;
		cin>>s>>t;
		s=t+"#"+s;//字符串映射
		ins(s,i);
	}
	build();//建AC自动机
	for(int i=1;i<=id;i++)G[fail[i]].push_back(i);
	for(int i=1;i<=n;i++)query(s[i]);//多模匹配
	dfs(0);
	for(int i=1;i<=q;i++){
		cout<<ed[ip[i]]<<'\n';
	}
	return 0;
}
相关推荐
码客-ygluu4 小时前
一个通用游戏数据服务器
c++·架构
another heaven4 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++
Code_Solitude4 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司4 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP7 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
xiaoye-duck7 小时前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
思麟呀7 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落8 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
旖旎夜光8 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习