阅读程序 · 答案 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
看到 magic 函数 → 先想四进制转换规则
进制搞错或漏掉 (l1!=l2||r1!=r2) 条件
考点:字符串子串枚举|四进制转换
程序定义 magic 将子串转为四进制值('a'→1),再暴力枚举所有子串对,统计编码唯一(无重复)的子串个数。