一言(ヒトコト)

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
*/
posted @ 2026-08-03 18:34  冬冬猫  阅读(3)  评论(0)    收藏  举报