K-Dominant Character CodeForces - 888C
2024-09-03 23:53:33
题目链接:https://vjudge.net/problem/CodeForces-888C
划一条线,使得不论怎么划线,都会出现一个特定的字符,那么这条线最短要多长。
用字符间隔考虑。
先判断哪些字符出现了,然后统计每个不同字符的出现次数,出现一次的和出现多次的分开判断。
出现一次的找到它的位置,取max(当前位置 - 字符串开始位置 + 1,字符串末位位置 - 当前位置 + 1),
然后遍历所有出现一次的字符,得出max的最小值,并记录,dis1
出现多次的找到相邻两个相同字符的间隔,取最大间隔的间隔k,再得出第一个出现的相同字符和开头的间隔+1,最后一个出现的相同字符和字符串末尾的间隔+1,和k比较取最大dis2
答案就是min(dis1,dis2)。
#include <cstring>
#include <iostream>
#include <cstdio> using namespace std; #define inf (1LL << 30) const int N = ;
char str[N];
int tmp[N];
int arr[N];
bool vis[]; int main(){ ios::sync_with_stdio(false);
cin.tie(); cin >> str;
int len = strlen(str) - ; for(int i = ; i <= len; i++){
arr[i] = str[i] - 'a' + ;
vis[arr[i]] = true; //哪些字符出现过
} int dis1 = inf;
int dis2 = inf;
int l = ;
for(int o = ; o < ; o++){ //'a'~'z'
if(!vis[o]) continue; l = ;
for(int i = ; i <= len; i++){
if(o == arr[i]) tmp[l++] = i;
}
--l;
//出现一次的
if(l == ){
int v = ;
v = max(v,max(tmp[l] - + ,len - tmp[] + ));
dis1 = min(dis1,v);
}
//出现多次的
else{
int v = ;
for(int i = ; i <= l; i++){
v = max(v,tmp[i] - tmp[i - ]);
} v = max(v,tmp[] - + ); //与字符串开头
v = max(v,len - tmp[l] + );//与字符串结尾 dis2 = min(dis2,v);
}
} cout << min(dis1,dis2) << endl; getchar();getchar(); return ;
}
最新文章
- 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~
- Win10 UI入门 圆形控件
- [moka同学笔记]window下.htacess文件 与linux下.htacess文件
- PInvoke和Marshal的姿势
- composer 272解决
- HDU 1517 (类巴什博奕) A Multiplication Game
- Codeforces 161 D. Distance in Tree (树dp)
- C# IO操作(三)文件编码
- start mysqld on Mac server
- CLR via C#可空值类型
- [置顶] Jquery发展
- UICollectionView 集合视图用法,自定义Cell
- prime算法求最小生成树(畅通工程再续)
- oracle 12c 新特性之(相同字段上的多重索引、ddl 日志、限制PGA的大小、分页查询)
- (六) 编写vivid
- docker容器多服务(不推荐)
- SPI核软件调试结果
- Linux中/etc/resolv.conf文件简析
- Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】
- (使用通过混淆+自己第三方保留成功混淆)AndroidStudio 混淆打包