Codeforces
关键信息:如果模板串第i个字符是小写,则被匹配的字符串需要完全和那个小写的完全一样;如果模板穿第i个字符是大写,则被匹配的字符串需要和那个字符的小写形式不同!(被匹配的字符一定全部都是小写形式的,而模板串任意形式!)
要求:三个被匹配的字符串:a,b,c;其中需要a,b与模板串匹配,而c不与模板穿匹配;
下面由我分析一下这道题:显然这道题需要根据模板串大小写两种情况来分析
1.模板串此位置大写:此时那个大写的字符的小写形式和c的完全相同,而a和b的字符皆和c不同.
翻译成代码: (a[i] != c[i] && b[i] != c[i])
2.模板串此位置小写:此时a和b需要完全相同,而二者皆与c不同即可;
翻译成代码: (a[i] == b[i] && a[i] != c[i])
综合分析:易知 第二个代码是第一个代码的子集,所以合并;
最终代码: (a[i] != c[i] && b[i] != c[i])
一下是这道题的代码,c++刚学不久,语法难免冗余,见谅!
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
using namespace std;
int n;
string a1, b1, c1;
int main()
{
int t; scanf("%d\n", &t);
while (t--)
{
scanf("%d\n", &n);
cin >> a1;
cin >> b1;
cin >> c1;
const char* a = a1.c_str();
const char* b = b1.c_str();
const char* c = c1.c_str();
bool flag = false;
for (int i = 0; i < n; i++)
{
if (a[i] != c[i] && b[i] != c[i])
{
flag = true;
break;
}
}
if (flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
奥,忘了,牛客网的那道题目其实很简单,但通过率才50%;嗯~我也错了
我错在一个点:审题;
题目这样问:”将系统输入的字符串重新排序,使得新字符串出现xiaohong”(输入的字符串一定有xaio和hong!)
这里我就想问了,你会怎么做呢?像我这样的蒟蒻,想到的方法永远是是个人随便都可以想到的
正确的思路是这样:可以先不管三七二十一直接先输出xiaohong,之后遍历字符串,遇到了第一次的xiao和第一次的hong直接”i+3”跳过即可.欸,可惜我不是这样想的,50%的人估计也不是这样想的,要不然不可能做错
对对,链接在这里,codeforces的~
https://codeforces.com/contest/1922/problem/A