哞叫时间

题目链接: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 @ 2025-02-18 20:53  Marinaco  阅读(20)  评论(0)    收藏  举报
//雪花飘落效果