选择题 · 答案 YES,NO,YES, · 考点:输入输出、位运算、分支结构、循环结构、一维数组、字符串(string)
← 整套速查表 NOIP 提高组初赛 全部真题#include <iostream>
using namespace std;
int main()
{
char a[100][100], b[100][100];
string c[100];
string tmp;
int n, i = 0, j = 0, k = 0, total_len[100], length[100][3];
cin >> n;
getline(cin, tmp);
for (i = 0; i < n; i++)
{
getline(cin, c[i]);
total_len[i] = c[i].size();
}
for (i = 0; i < n; i++)
{
j = 0;
while (c[i][j] != ':')
{
a[i][k] = c[i][j];
k = k + 1;
j++;
}
length[i][1] = k - 1;
a[i][k] = 0;
k = 0;
for (j = j + 1; j < total_len[i]; j++)
{
b[i][k] = c[i][j];
k = k + 1;
}
length[i][2] = k - 1;
b[i][k] = 0;
k = 0;
}
for (i = 0; i < n; i++)
{
if (length[i][1] >= length[i][2])
cout << "NO,";
else
{
k = 0;
for (j = 0; j < length[i][2]; j++)
{
if (a[i][k] == b[i][j])
k = k + 1;
if (k > length[i][1])
break;
}
if (j == length[i][2])
cout << "NO,";
else
cout << "YES,";
}
}
cout << endl;
return 0;
}输入: 3 AB:ACDEbFBkBD AR:ACDBrT SARS:Severe Atypical Respiratory Syndrome 输出:_________ (注:输入各行前后均无空格)
冒号分前后:先判前段长度是否≥后段长度,再判前段是否为后段前缀。
易错:长度比较方向反了(≥时输出NO);前缀匹配时k只增不减,一旦超过前段长就break,导致逻辑判断失误。
考点:程序阅读(字符串处理)
程序读入n行字符串,每行按':'分为前后两段,先比较长度,再判断前段是否为后段的前缀,输出YES,或NO,。