1 条题解
-
0
题意理解
给定一个字符串 ,要求找出它的一个非空子串 ,使得 的不同非空子串个数 为偶数。如果不存在这样的 ,输出 。
解题思路
直接计算 是很难的,因为子串数量可能非常大。我们需要换个角度思考:是否存在某种“局部”的特征,可以保证 一定是偶数?
观察小长度子串
长度 的子串
- 子串
不同子串:
(奇数)❌
结论:没有长度为 的合法子串。
长度 的子串
-
子串
不同子串:
(偶数)✅ -
子串
不同子串:
(奇数)❌
结论:如果存在两个相邻相同字符,取该长度为 的子串即可。
长度 的子串
考虑相邻字符都不同的情况(否则已被上面情况覆盖):
-
不同子串:$\{\text{a},\text{b},\text{ab},\text{ba},\text{aba}\}$
(奇数)❌ -
不同子串:$\{\text{a},\text{b},\text{c},\text{ab},\text{bc},\text{abc}\}$
(偶数)✅
结论:如果存在三个连续互不相同的字符,取该长度为 的子串即可。
剩余情况分析
如果字符串 既没有相邻相同字符,也没有三个连续互不相同的字符,那么它只能是什么形式?
假设相邻字符都不同(否则已被覆盖),并且不能有三个不同字符连续,那么任意连续三个字符中必有两个相同。
因为相邻已经不同,所以只有可能是形如:
(两个字符交替出现)例如:
对于这种字符串,我们来计算不同子串个数:
- 长度为 的子串:只有 和 → 个
- 长度为 的子串:只有 和 → 个
- 长度为 的子串:只有 和 → 个
- ...
- 长度为 的子串: 个
- 长度为 的子串:只有整个字符串本身 → 个
所以总的不同子串数:
而 永远是 奇数。
因此,对于这种交替结构的字符串,不存在合法子串。
最终算法
. 扫描 ,如果存在 ,输出 并结束。 . 否则,扫描 ,如果存在 两两不同,输出 并结束。 . 否则,输出 。
复杂度分析
- 每个测试用例只需 扫描。
- 总长度 ,完全可行。
代码实现
#include<bits/stdc++.h> using namespace std; void solve() { string s; cin >> s; int n = s.size(); // 情况1:找相邻相同字符 for (int i = 0; i + 1 < n; i++) { if (s[i] == s[i + 1]) { cout << s.substr(i, 2) << '\n'; return; } } // 情况2:找三个连续不同字符 for (int i = 0; i + 2 < n; i++) { if (s[i] != s[i + 1] && s[i] != s[i + 2] && s[i + 1] != s[i + 2]) { cout << s.substr(i, 3) << '\n'; return; } } // 情况3:无解 cout << -1 << '\n'; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int t; cin >> t; while (t--) solve(); return 0; }
样例验证
样例输入
5 dcabaac a youknowwho codeforces bangladesh运行过程
.
- 扫描到 相邻相同 → 输出 (但题解输出 ,说明答案不唯一,我们的 也是合法子串)
.
- 无相邻相同,无三个不同 → 输出
.
- 无相邻相同,但存在 三不同 → 输出 (题解输出整个串,也合法)
.
- 扫描到 三不同 → 输出 (题解输出 ,也合法)
.
- 扫描到 三不同 → 输出 (题解输出 ,也合法)
✅ 所有输出均满足条件。
- 子串
- 1
信息
- ID
- 6594
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者