题解归档 - cf888C
本文最后由方少年更新于2026 年 6 月 28 日,已超过0天没有更新。如果文章内容或图片资源失效,请留言反馈,将会及时处理,谢谢!
题解归档 - cf888C
本文由 cf-code 本地题解库自动归档;公开内容以本地 AC/验证版本为准。
- 本地编号:
cf888C - 本地来源:
problems/cf888C/idea.md - 题目链接:https://codeforces.com/contest/888/problem/C
- 原始标题:CF888C K-Dominant Character
思路
CF888C K-Dominant Character
题意
给定小写串 s。若字符 c 满足:所有长度 ≥ k 的子串都包含 c,则称 c 为 k-dominant。求最小的 k,使得存在至少一个 k-dominant 字符。
做法
对每个出现过的字符 c,记其出现位置为 p_0 < p_1 < ... < p_{m-1}。
不含 c 的最长连续段长度为:
$$\max\big(p_0,\; p_{i+1}-p_i-1,\; n-1-p_{m-1}\big)$$
记为 gap。则 c 成为 k-dominant 的最小 k = gap + 1(因为长度 gap+1 的子串可以避开 c,而 gap+2 不行)。
答案为所有出现字符的最小 k。复杂度 O(n)。
样例
abacaba:a的最大间隔为 1 → k=2zzzzz:间隔 0 → k=1abcde:c的最大间隔为 2 → k=3
验证
- 样例 + 对拍 500 组(brute 枚举 k 与子串)
代码
来源:problems/cf888C/solution.cpp
/* Author: likely
* Time: 2026-06-08 03:40:00
**/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
vector<ll>pos[26];
ll n,i,j,k,zc,pd,cur,cnt,ans;
int main(){
cin>>s;
n=s.size();
ans=n+1;
for(i=0;i<n;i++) pos[s[i]-'a'].push_back(i);
for(k=0;k<26;k++){
if(pos[k].empty()) continue;
zc=pos[k][0];
pd=n-1-pos[k].back();
cur=max(zc,pd);
for(i=0;i+1<(ll)pos[k].size();i++) cur=max(cur,pos[k][i+1]-pos[k][i]-1);
ans=min(ans,cur+1);
}
cout<<ans<<"\n";
return 0;
}
~ ~ The End ~ ~
文章标题:题解归档 - cf888C
文章链接:https://www.fangshaonian.cn/archives/389/
最后编辑:2026 年 6 月 28 日 19:08 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)