1610: DNA序列---变异问题
时间限制: 2 Sec 内存限制: 128 MB
提交: 18 解决: 3
[提交] [状态] [讨论版] [命题人:mfdy]
题目描述
遗传是子代保持亲代特性的现象,变异是指子代与亲代存在不同之处。所谓突变,是指DNA序列在复制的过程中出现了可遗传性的改变。突变是某些遗传性疾病的主要原因。比如。染色体重组,基因突变等。其中,基因突变是造成变异的主要原因。
在DNA序列中,基因突变可能将一种带有遗传信息的密码子变成另外一种未知信息。我们研究的是,对给定的一条变异的DNA序列片段,有多少密码子被改变的。
假设有n个不同的密码子A1, A2,…, An,每个密码子都是由A,G,C,T 组成的长度≤10的字符串,并且任意密码子之间相互不为前缀。
给定一个由上述若干个密码子组成的原始DNA序列片段T(长度≤ 500),和k个等长的有变异的DNA序列S1,S2,…, Sk 你能否帮助Dr. Kong找到每条变异DNA片段中发生变异的密码子个数。
输入
输入有多组测试数据(不超过6组),每组数据格式如下:
第一行: n k ( 1≤ n ≤ 100 1 ≤ k ≤ 10)
接下来有M行: A1,
……
An
第M+2行: T
接下来有K行: S1,
......
Sk
输出
输出每条变异DNA序列中发生变异密码子的个数。
样例输入
5 2 GCT ACT AGTT AAAAAGGGGG CATAAGGAGA AGTTACTACTAAAAAGGGGG AGTTACCACTAAAAAGGGGG GTCAACTGCTAACGAGGGGG
样例输出
1 3
思路:
暴力匹配就好,用substr处理string
string newS=oldS.substr(pos,len)
从pos处截len长的字符串赋给newS
注意:多组样例!!!
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<stack>
#define ll long long
using namespace std;
struct A{
string s;
int len;
}v[505];
string t;
string P[105];
int n,k,q=0;
bool judge(int from,int to){//截取[from,to]的字符串
string tmp=t;
tmp=tmp.substr(from,to-from+1);
for(int i=1;i<=n;i++){
if(tmp==P[i]){
v[q].s=tmp;
v[q++].len=tmp.length();
return true;
}
}
return false;
}
int main(){
while(cin>>n>>k){
for(int i=1;i<=n;i++){
cin>>P[i];
}
cin>>t;
int len=t.length(),last=0;
for(int i=0;i<len;i++){
if(judge(last,i)){
last=i+1;
}
}
while(k--){
string tmp;
cin>>tmp;
int ans=0,sum=0;
for(int i=0;i<q;i++){
string s=tmp;
s=s.substr(sum,v[i].len);
if(s!=v[i].s){
ans++;
}
sum+=v[i].len;
}
cout<<ans<<endl;
}
memset(v,0,sizeof(v));
}
}