》》》点我查看「视频」详解》》》
[语言月赛 202311] 基因
题目描述
有一个长度为 n n n 的字符串 S S S。其只包含有大写字母。
小 A 将 S S S 进行翻转后,得到另一个字符串 S ′ S' S′。两个字符串 S S S 与 S ′ S' S′ 对应配对。例如说,对于 S = A T C G T S=\tt{ATCGT} S=ATCGT,则有 S ′ = T G C T A S'=\tt{TGCTA} S′=TGCTA, S S S 与 S ′ S' S′ 进行配对。
对于两个字符串 S , S ′ S,S' S,S′ 的第 i i i( 1 ≤ i ≤ n 1 \leq i \leq n 1≤i≤n)个字母,配对规则如下:
- 定义 A \tt A A 与 T \tt T T, C \tt C C 与 G \tt G G 为可以配对的字母。
- 如果 S i S_i Si 与 S i ′ S_i' Si′ 为可以配对的字母,那么该字符串的稳定性增加 i i i。
- 如果 S i S_i Si 或者 S i ′ S_i' Si′ 中任意一方出现非 A , T , C , G \tt A,\tt T,\tt C,\tt G A,T,C,G 的字母,则整个字符串的稳定性将直接为 0 0 0。
现在给定 T T T 个字符串 S S S,对每一个字符串,询问若用其翻转再进行配对,其稳定性将如何。
输入格式
第一行输入一个正整数 T T T,表示给定多少个字符串。对于每一个字符串:
- 第一行输入一个正整数 n n n,表示字符串的长度;
- 第二行输入一个字符串 S S S,表示该字符串。
输出格式
对于每个字符串,输出一行一个整数,表示若用其翻转再进行配对,其稳定性将如何。
样例 #1
样例输入 #1
3
5
ATCGT
6
ACATGT
5
ATCGU
样例输出 #1
6
21
0
提示
【样例解释】
- 对于第一个字符串, S = A T C G T S=\tt{{A}TCG{T}} S=ATCGT, S ′ = T G C T A S'=\tt{{T}GCT{A}} S′=TGCTA。标红色的一组与蓝色的一组为可以配对的字母。它们分别是 S S S 的第 1 1 1 个字母和第 5 5 5 个字母,因此稳定性是 1 + 5 = 6 1+5=6 1+5=6。
- 对于第二个字符串, S = A C A T G T S=\tt{{A}{C}{A}{T}{G}{T}} S=ACATGT, S ′ = T G T A C A S'=\tt{{T}{G}{T}{A}{C}{A}} S′=TGTACA,每个对应位置上的字母都可以配对,因此稳定性是 1 + 2 + 3 + ⋯ + 6 = 21 1+2+3+\dots+6=21 1+2+3+⋯+6=21
- 对于第三条字符串,出现了非 A , T , C , G \tt A,\tt T,\tt C,\tt G A,T,C,G 的字母 U \tt U U,因此稳定性为 0 0 0。
【数据范围】
对于所有数据,保证: 1 ≤ T ≤ 5 1\leq T\leq 5 1≤T≤5, 1 ≤ n ≤ 1 0 5 1\leq n\leq 10^5 1≤n≤105, S S S 中出现的所有字母保证为大写英语字母。
AC_Code
#include <bits/stdc++.h>
using namespace std;
bool check1(char a)
{
if(a != 'A' && a != 'T' && a != 'C' && a != 'G')
return false;
return true;
}
bool check2(char a, char b)
{
if(a == 'T' && b == 'A') return true;
if(a == 'A' && b == 'T') return true;
if(a == 'C' && b == 'G') return true;
if(a == 'G' && b == 'C') return true;
return false;
}
int main()
{
int t;
cin >> t;
while(t --)
{
int n;
string s1;
cin >> n >> s1;
string s2 = s1;
reverse(s2.begin(), s2.end());
long long tot = 0;
for(int i = 0; i < s1.size(); i ++)
{
if(!check1(s1[i]) || !check1(s2[i]))
{
tot = 0;
break;
}
if(check2(s1[i], s2[i]))
tot += i + 1;
}
cout << tot << "\n";
}
return 0;
}
》》》点我查看「视频」详解》》》