1 条题解
-
0
📝 题目大意
给定一个长度为 ()的小写字母字符串 。对于每个 ,求最大的非负整数 ,使得 且对所有 都有 。
💡 解题思路
-
题目分析: 最大为 , 的运算量约为 ,在 C++ 中完全可行,直接使用双循环暴力枚举即可。
-
算法推导:
- 外层循环枚举 (),即偏移量。
- 内层循环从小到大地枚举 (),检查 与 是否相等。
- 若 ,则 可以增加 (这对字符满足条件);若 ,则
break跳出内层循环,因为后续更大的 必然不满足条件。 - 最终 即为满足条件的最大长度,直接输出。
-
边界与细节:
- 始终满足条件,因此当 时也会正确输出 。
- 字符串下标从 开始,代码中 对应
s[k-1], 对应s[k+i-1],注意下标偏移。 - 内层循环上限为 ,确保 。
⏱️ 复杂度分析
- 时间复杂度:,外层循环 次,内层循环至多 次。
- 空间复杂度:,仅存储输入字符串。
💻 标准代码 (C++)
#include <bits/stdc++.h> using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) int main() { int n; string s; cin >> n >> s; // 枚举偏移量 i(对应题目中的 i,从 1 到 N-1) for(int i = 1; i < n; i++){ int l = 0; // 最大满足条件的长度 // 从小到大枚举 k,检查 S[k] 与 S[k+i] 是否不同 for(int k = 1; k <= n-i; k++){ // 注意:题目中下标从 1 开始,代码中从 0 开始 if(s.at(k-1) == s.at(k+i-1)) break; // 一旦相等,此后的 k 都不满足 l++; // 当前 k 满足条件,l 加 1 } cout << l << endl; } } -
- 1
信息
- ID
- 669
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者