F. Min Cost String题解报告
标签 :字符串 构造
题目
题意:
给出常数n,k,让我们用前k个小写字母构造出长度为n的字符串
字母可以在前k范围内任意使用或不使用,但要求使输出字符串中索引对最少
当s[i]=s[j]并且是s[i+1]=s[j+1] (1≤i<j<|s|) 就构成了索引对
解题思路:
要使索引对最少,我们可以把字符串分成一对一对看,
比如 s=aaba 此时我们看到有三对 aa ab ba 已经被取过了
那么接下来的思路就是先枚举出全部的 字符对 添加到s中
若此时字符串长度大于等于n 则输出前n个字符
若此时字符字符串长度小于n
由于所有能构成的字符对都已经在s中了 再添加无论如何都会有索引对出现
我们让s += s直到长度大于n 再截取前n个字符输出
resize函数使用方法
当n长度小于字符串s的长度 s.resize(n),截取s前n个字符
当n长度大于字符串s的长度 char a; s.resize(n,a),在s后添加字符a直到s长度达到n
代码实现
#include <iostream>
#include <string>
using namespace std;
int main(){
long long n,k;
cin>>n>>k;
string s("");
for(int i=0;i<k;i++){
s+='a'+i;
for(int j=i+1;j<k;j++)
{
s+='a'+i;
s+='a'+j;
}
}
while(s.size()<n)s+=s;
s.resize(n);
cout<<s<<endl;
}