哞叫时间

题目链接:https://www.acwing.com/problem/content/description/6126/

题意:

给定一个长度为n的字符串,规定若该字符串一个abb形式的子串数量大于等于f,则满足条件
现在允许字符串改变任意一个字符(或者不改变),求可能满足条件的子串

思路:

按照答案枚举,即先枚举abb类型的字符串共有26x25种
再遍历ss,原先就匹配上的用占位符覆盖。
如果满足条件的子串数量>=f,不用改变任意一个字符 该字串都满足条件
<f-1,即使改变一个字符,也匹配不上,该字符不满足条件
==f-1时
再遍历观察是否能够匹配到ab,ab,ab*,(三个位置都不能被占位符填充)若能,该字符串加入到答案中

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define endl "\n"
#pragma GCC optimize(3)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const ll llmax=LLONG_MAX;
const int maxn=1e5+5;
const int mod=1e9+7;
int n,f;
string s;
string ss;
bool check(string k,int i){
if(ss[i]==k[0]&&ss[i+1]==k[1]&&ss[i+2]==k[2])return true;
return false;
}
signed main()
{
ios::sync_with_stdio(false),cin.tie(0);
cin>>n>>f;
int res=0;
vector<string>ans;
vector<string>x;
for(int i=0;i<26;i++){
char c1='a'+i;
for(int j=0;j<26;j++){
char c2='a'+j;
if(c1!=c2){
string k;k+=c1;k+=c2;k+=c2;
x.pb(k);
}
}
}
string s;cin>>s;
s=" "+s;
for(int j=0;j<x.size();j++){
ss=s;
string p=x[j];
int cnt=0;
rep(i,1,n-2){
if(check(p,i)){
cnt++;
ss[i]='#';
ss[i+1]='#';
ss[i+2]='#';
}
}
if(cnt>=f){
res++;
ans.pb(p);
}else if(cnt<f-1)continue;
else{
bool f=false;
rep(i,1,n-2){
if(ss[i]=='#'||ss[i+1]=='#'||ss[i+2]=='#')continue;
if((ss[i+1]==p[1]&&ss[i+2]==p[2])||(ss[i]==p[0]&&ss[i+2]==p[2])||(ss[i]==p[0]&&ss[i+1]==p[1])){
f=true;
break;
}
}
if(f){
res++;
ans.pb(p);
}
}
}
cout<<res<<endl;
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++){
cout<<ans[i]<<endl;
}
return 0;
}
posted @   Marinaco  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
//雪花飘落效果
点击右上角即可分享
微信分享提示