ASC 19 D DNA Analysis(多测版)
题面
Karelia Mutation Project (KMP) 的生物学家最近启动了一个新项目,旨在证明人类和猛犸象是近亲。为了证明这一点,他们计划进行如下实验:
将人类的DNA与猛犸象的DNA进行比较。DNA被分割成若干长度为 n 的片段,然后逐段比较。由于可能存在突变,比较过程如下进行。
给定一个字符串 α,如果 α 可以表示为 xyz(其中 x, y, z 可能是空字符串),并且 β = xyᴿz(其中 yᴿ 是 y 的反转,例如 "abc"ᴿ = "cba"),那么我们称 α 突变为 β。
如果 α 可以通过至多 4 次突变转化为 β,则称字符串 α 和 β 是相似的。
s翻转4次到达t
相当于s翻转2次
t也翻转两次
最后相同
那我们枚举s所有翻转两次的情况,存到set里面,然后在t翻转的时候看set里面有没有可以得到的字符串
点击查看代码
#include<bits/stdc++.h>
#define Elysia return
using namespace std;
typedef long long LL;
const int N=30;
string s,t;
set<string> a;
int n,m;
void solve2(string &tmp,int l,int r){
string ans;
for(int i=0;i<l;i++) ans+=tmp[i];
for(int i=r;i>=l;i--) ans+=tmp[i];
for(int i=r+1;i<tmp.size();i++) ans+=tmp[i];
tmp=ans;
}
void solve(string res,int d){
a.insert(res);
if(d>=2) Elysia;
for(int i=0;i<res.size();i++){
for(int j=i+1;j<res.size();j++){
solve2(res,i,j);
solve(res,d+1);
solve2(res,i,j);
}
}
}
bool check(string res,int d){
if(a.count(res)) Elysia true;
if(d>=2) Elysia false;
for(int i=0;i<res.size();i++){
for(int j=i+1;j<res.size();j++){
solve2(res,i,j);
if(check(res,d+1)) Elysia true;
solve2(res,i,j);
}
}
Elysia false;
}
int main(){
int T;
cin>>T;
while(T--){
a.clear();
cin>>s>>t;
n=s.size(),m=t.size();
solve(s,0);
if(check(t,0)){
cout<<"Similar\n";
}
else{
cout<<"Different\n";
}
}
Elysia 0;
}
/*
1
ATGAATGA
AGGAATTA
*/

浙公网安备 33010602011771号