题目大意
每组给定 𝑛,𝑘,𝑚 和一个字符串 𝑠,字符串长度为 𝑚。判断所有长度为 𝑛,由前 𝑘 种小写字母构成的字符串是否都是 𝑠 的子序列。符合条件输出 YES,否则输出 NO 和一组反例。
思路
可以这样想,若满足
y
e
s
yes
yes,需要把
m
m
m长的字符串分为
p
p
p段,每段都包含前
k
k
k个小写字母
所以开始分段,
c
n
t
cnt
cnt记录不同字母数量,到达
k
k
k重置
c
n
t
cnt
cnt,最后得到
p
p
p段,如果
p
>
=
n
p>=n
p>=n则直接输出
y
e
s
yes
yes,任何长为
n
n
n,仅包含前
k
k
k个字母的串都能形成
若
p
<
n
p<n
p<n,构造字串,最佳方法是用前
p
p
p段每段最后一个字母,加上随便一个没出现过的字符即可
ACcode
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve()
{
int n,k,m;cin>>n>>k>>m;
string s;cin>>s;
s=' '+s;
vector<int>vis(300,0);
int cnt=0;
string str;
for(int i=1;i<=m;i++){
if(!vis[s[i]-'a'+1])cnt++,vis[s[i]-'a'+1]=1;
if(cnt==k){
cnt=0;
str+=s[i];
for(int i=0;i<300;i++)vis[i]=0;
}
}
if(str.size()>=n){
cout<<"YES"<<'\n';
return;
}
for(int i=1;i<=k;i++){
if(!vis[i]){
cout<<"NO"<<'\n';
cout<<str<<string(n-str.size(),char('a'+i-1))<<'\n';
return;
}
}
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--){
solve();
}
return 0;
}