NOIP 提高组初赛 · NOIP 2018 提高组初赛试题 第 20 题

阅读程序 · 答案 16 · 考点:输入输出、位运算、分支结构、循环结构、字符串(string)

← 整套速查表 NOIP 提高组初赛 全部真题

题目

阅读程序写结果:

#include <iostream>
using namespace std;
string s;

long long magic(int l, int r) {
    long long ans = 0;
        for (int i = l; i <= r; ++i) {
        ans = ans * 4 + s[i] - ‘a’ + 1;
    }
return ans;
}

int main() {
    cin >> s;
    int len = s.length();
    int ans = 0;
    for (int l1 = 0; l1 < len; ++l1) {
        for (int r1 = l1; r1 < len; ++r1) {
            bool bo = true;
            for (int l2 = 0; l2 < len; ++l2) {
                for (int r2 = l2; r2 < len; ++r2) {
                    if (magic(l1, r1) == magic(l2, r2) 
                    	&& (l1 != l2 || r1 != r2)) 
                    	bo = false;
                }
            }
            
            if (bo) {
                ans += 1;
            }
        }
    }
    cout << ans << endl;
    return 0;
}

输入:abacaba

答案:16

考点

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

解题思维

看到 magic 函数 → 先想四进制转换规则

常见错误

进制搞错或漏掉 (l1!=l2||r1!=r2) 条件

详细解析(节选)

考点:字符串子串枚举|四进制转换

程序在做什么

程序定义 magic 将子串转为四进制值('a'→1),再暴力枚举所有子串对,统计编码唯一(无重复)的子串个数。

同考点真题

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