首页 > 其他分享 >[TJOI2018] 碱基序列(题库给的什么鬼名字)

[TJOI2018] 碱基序列(题库给的什么鬼名字)

时间:2024-04-28 16:44:05浏览次数:14  
标签:12000 int 碱基 long len 字符串 题库 TJOI2018

题目描述
小豆参加了生物实验室。在实验室里,他主要研究蛋臼质。他现在研究的蛋臼质是由k个氨基酸按一定顺序构成的 。每一个氨基酸都可能有a种碱基序 列si_j 构成。现在小豆有一个碱基串s,小豆想知道在这个碱基上都多少中 不同的组合方式可能得到这个蛋白质。即求由k段字符串有序合并成的字符串s1,有多少种不同方式能够匹配字符串 s,其中k段字符串的选法不同,或者与s匹配上 的位置不同认为是不同的方式。

输入格式
第一行一个数,表示这个蛋臼质由k个氨基酸。 第二行一个字符串s,表示小豆现在有的碱基串。 第三行开始接下来k行表示第i个氨基酸可能的碱基序列,对于第i个氨基酸,ai表示这个氨基酸可能的碱基序列种数, 接下来ai个字符串表示这ai 种可能的碱基序列,用空格隔开。 1 ≤ k ≤ 100, |s| ≤ 10000,ai ≤ 10

输出格式
输出一个数目表示不同的方案数 (不同的方案数是指不同的子碱基串或者相同的碱基串不同的氨基酸排列方式) 答案对1e9+7取模

样例
样例输入
2
ABC
2 A AB
2 C BC
样例输出
2

我他妈就是弱智
image

感谢wlesq的题解
这是一道hash+背包DP(很显然我没发现),如果当前选出的子串可以匹配,就可以从字符串相对应的子串的前一位置的状态转移过来(注意,我说的是子串第一位的前一位),不懂的看下图
image
f[r-len+1]是没有数的,f[r]的上一个状态是f[r-len]
f[i][j]表示前i长的主串匹配了第j列的碱基的情况
\(f[i][j]+=f[i-len_{j,k}] [j-1]\)(hash(s1)==hash(\(s_{j,k}\)))
然后没了,关于前缀求子串可以看乌力波,谴责wlesq速速修改题解

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
int base=131;
const int mod=1e9+7;
int n,m;
char s[12000];
char c[120][15][1000];
long long f[12000][120];
ull has[12000];
int num[120];
ull bas[12000];
void get(){
	int len=strlen(s+1);
	for(int i=1;i<=len;i++){
		has[i]=has[i-1]*base+s[i];
	}
	bas[0]=1;
	for(int i=1;i<=len;i++){
		bas[i]=bas[i-1]*base;
	}
}
ull gethash(int from,int to){
	return has[to]-has[from-1]*bas[to-from+1];
}
ull check(char si[]){
	ull res=0;
	int len=strlen(si+1);
	for(int i=1;i<=len;i++){
		res=res*base+si[i];
	}
	return res;
}
int main(){
	cin>>n;
	scanf("%s",s+1);
	for(int i=1;i<=n;i++){
		cin>>m;
		num[i]=m;
		for(int j=1;j<=m;j++){
			scanf("%s",c[i][j]+1);
		}
	}
	get();
	int lensum=strlen(s+1);
	for(int i=0;i<=lensum;i++) f[i][0]=1;
	for(int i=1;i<=n;i++){
		for(int k=1;k<=num[i];k++){
			int len2=strlen(c[i][k]+1);
//			for(int j=1;j<=len2;j++){
//				cout<<c[i][k][j];
//			} 
			for(int j=lensum;j>=len2;j--){
				if(check(c[i][k])==gethash(j-len2+1,j)){
					f[j][i]=(f[j][i]+f[j-len2][i-1])%mod;
//					cout<<f[j][i]<<" "<<f[j-len2][i-1]<<" ";
				}
			}
//			cout<<endl;
		}
	}
	long long ans=0;
	for(int i=1;i<=lensum;i++){
		ans=(ans+f[i][n])%mod;
	}
	cout<<ans%mod<<endl;
}

对了,我用vector+string没调出来,有大佬能否看一下

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef signed long long ull;
vector<string> q[120];
ull has[12000],bas[12000];
long long f[12000][120];
const int base=131,mod=1e9+7;
int n,m;
string s,c;
void solve(){
	bas[0]=1;
	has[0]=s[0];
	for(int i=1;i<s.length();i++){
		has[i]=has[i-1]*base+s[i];
	}
	for(int i=1;i<=10000;i++) bas[i]=bas[i-1]*base;
}
long long check(string lm){
	ull res=0;
	for(int i=0;i<lm.length();i++){
		res=res*base+lm[i];
	}
	return res;
}
long long find(int from,int to){
	if(from<=0) return has[to];
	return (has[to]-has[from-1]*bas[to-from+1]);
}
int main(){
	cin>>n;
	cin>>s;
	solve();
	for(int i=1;i<=n;i++){
		cin>>m;
		for(int j=1;j<=m;j++){
			cin>>c;
			q[i].push_back(c);
		}
	}
//	cout<<q[2].size()<<endl;
//	cout<<s.length(); 
	for(int i=0;i<s.length();i++) f[i][0]=1;
	
	for(int i=1;i<=n;i++){
		int len1=q[i].size()-1;
		for(int k=0;k<=len1;k++){
			int len=q[i][k].length();
			int len3=s.length()-1;
			for(int j=len3;j>=len-1;j--){
				if(check(q[i][k])==find(j+1-len,j)){
					if(j-len<=0) f[j][i]+=f[0][i-1];
					else f[j][i]+=f[j-len][i-1];
//					cout<<j<<" "<<i<<" "<<f[j][i]<<" ";
//					cout<<"|||";
				}
			}
		}
//		cout<<endl;
	}
//	cout<<endl;
//	cout<<endl;
	long long ans=0;
//	for(int i=0;i<s.length();i++){
//		for(int j=1;j<=n;j++){
//			cout<<f[i][j]<<" ";
//		}
//		cout<<endl;
//	}
	for(int i=0;i<s.length();i++){
		ans+=f[i][n];
	}
	cout<<ans%mod<<endl;
} 

标签:12000,int,碱基,long,len,字符串,题库,TJOI2018
From: https://www.cnblogs.com/PeppaEvenPigShiGeNiuBDePig/p/18164014

相关文章

  • Linux试题库100试题测验
     Linux基础知识一、单选题(共20题每题1分共20分) 下面哪个Linux命令可以一次显示一页内容?CA.pause B.cat C.more D.grep 怎样更改一个文件的权限设置?BA.attrib B.chmod C.change D.file 3.下面哪个参数可以删除一个用户并同时删除用......
  • 操作系统】试题真题库第1章操作系统概述
    操作系统】第1章操作系统概述——单选题原创2023-09-2220:57:59阅读量145英伟达GR00TW星星S 码龄1年 关注一.单选题1.在计算机系统中配置操作系统的主要目的是(B).A.增强计算机系统的功能B.提高系统资源的利用率C.提高系统的运行速度D.合理组织系......
  • 脚本语言系列之Python | python练习题最全题库(1)
    脚本语言系列之Python|python练习题最全题库(1)脚本语言系列之Python|python练习题最全题库(1) 精选python语言基础的填空题400+,并附有答案,初学者一定要刷一遍。刷题前,可以先看一遍基础知识点,已梳理好,移步:测试allen说:脚本语言系列之Python|系列文章传送门这......
  • 碱基序列(str)
    [TJOI2018]碱基序列题目描述小豆参加了生物实验室。在实验室里,他主要研究蛋白质。他现在研究的蛋白质是由\(k\)个氨基酸按一定顺序构成的。每一个氨基酸都可能有\(a\)种碱基序列\(s_{i,j}\)构成。现在小豆有一个碱基串\(s\),小豆想知道在这个碱基上都多少种不同的组合方......
  • 他是JSOI第一名,也是在线知名题库的vjudge“网红”
    (省流:查找替换,原文)2077年菜就多练省省队选拔赛(JSOI)上,以优秀成绩斩下第一名年仅初三的@hangry_sol,成为最夺目的选手之一。而且虽然是初三的选手,但他取得优异成绩后,不少网友并不感到陌生,纷纷留言:这不是vjudge上天天爆切神仙题的小哥吗?没错,和其他JSOI选手不同,hangry_sol......
  • 【华为OD】2024年华为OD机试C卷真题集:最新的真题集题库 C/C++/Java/python/JavaScript
    【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客华为OD机试2024年C卷真题题集题库,有2种分数的题目列表,分别是100分的列表、200分的列表需要订阅请看链接:C卷100......
  • 洛谷 官方题库 Python 第十一天
    【数学1】基础数学问题最大公约数gcd=math.gcd(a,b)注意这个gcd支持传入多参数,有两种写法,建议用星号,因为reduce如果a是空数组会报错。注意gcd(a,0)=a,即任意数和0的gcd都是自己,参照循环相减法。gcd(*a)是Python中的一种用法,它可以计算传递给函数gcd()的可变数量的参数的......
  • Vue2 + Spring Boot的题库管理和在线考试系统
    一个demo从0到1的搭建~使用mybatisplus快速开发springboot项目(一)--初始化-CSDN博客使用mybatisplus快速开发springboot项目(二)--业务实现_如何用mybatis-plus写业务-CSDN博客使用mybatisplus快速开发springboot项目(三)--JWT拦截器-CSDN博客使用mybatisplus快速开发springboot......
  • 由AI生成的事业单位计算机题库
    当然可以。以下是一份针对事业单位计算机基础知识的题库,包含了不同类型的题目,旨在帮助考生全面复习和掌握计算机基础知识。选择题计算机中最小的数据单位是:A.字B.字节C.位D.千字节以下哪个设备不是输入设备?A.键盘B.鼠标C.打印机D.扫描仪......
  • python蓝桥题库2141-山
    见题目我最近买了他们官方的程序设计竞赛的书,一本紫色的,在引子部分这部分出现了这道题,最开始看代码的时候没看懂,我现在来逐层分析,你需要有一定基础来看这篇文章,还要就是我的见解偶数情况第一行先设置了个ans的计数变量接下来range循环20-20223(不对啊?这和题目要求的循环......