NOIP 提高组初赛 · NOIP 2016 提高组初赛试题 第 24 题

选择题 · 答案 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 输出:_________ (注:输入各行前后均无空格)

答案:YES,NO,YES,

考点

输入输出位运算 讲解 →位运算 真题汇总 →分支结构循环结构一维数组字符串(string)

解题思维

冒号分前后:先判前段长度是否≥后段长度,再判前段是否为后段前缀。

常见错误

易错:长度比较方向反了(≥时输出NO);前缀匹配时k只增不减,一旦超过前段长就break,导致逻辑判断失误。

详细解析(节选)

考点:程序阅读(字符串处理)

程序在做什么

程序读入n行字符串,每行按':'分为前后两段,先比较长度,再判断前段是否为后段的前缀,输出YES,或NO,。

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断