当前位置: 首页 > 科技观察

一个简单的问题,看y总的C++代码风格哪里比我自己的好

时间:2023-03-12 02:29:22 科技观察

题目原题:AcWing3805.环形数组[1]给定一个长度为的字符串。请构造一个由长度为的小写字母组成的字符串。要求,string需要满足:string在字典序上大于string。string的字母表集是string的字母表的子集。一个字符串的字母集是指该字符串中包含的所有不同字母的集合,例如abadaba的字母集是。字符串在字典序上尽可能小。答案保证存在。输入格式的第一行包含一个整数,表示共有几组测试数据。每组数据的第一行包含两个整数和。第二行包含长度的字符串表示形式。输出格式每组数据输出一行满足所有条件的字符串。数据范围前三个测试点满足。所有测试点满足,在同一个测试点,所有的总和不超过,所有的总和不超过。输入样本:433abc32abc33ayy23ba输出样本:acaacyaaba思路:分情况讨论当k大于n时,前n位不变,我们让n位开始填充出现过的最小字符。当k小于等于n时,我们从原字符串的k-1位开始向前查找,如果当前字符还有变小的可能,则继续变小,停止查找,输出新的字符串code#include#include#includeusingnamespacestd;intn,k;boolused[26];strings,t;stringtail(){inti=0;for(;i<26;++i)如果(使用[i])中断;chara='a'+i;stringres(k-n,a);returnres;}stringget(){charmax_char;for(inti=25;i>=0;--i){if(used[i]){max_char='a'+i;break;}}charmin_char;for(inti=0;i<26;++i){if(used[i]){min_char='a'+i;break;}}inti=k-1;for(;i>=0;--i){if(s[i]!=max_char)break;}stringres1=s.substr(0,i);stringres2;for(intj=s[i]-'a'+1;j<26;++j){if(used[j]){res2=(char)'a'+j;break;}}stringres3(k-i-1,min_char);returnres1+res2+res3;}intmain(){intT;cin>>T;while(T--){cin>>n>>k;cin>>s;memset(used,0,sizeofused);for(inti=0;in){t=s+tail();}else{t=get();}cout<#include#includeusingnamespacestd;constintN=100010;intn,k;chars1[N],s2[N];boolst[26];charget_min(){for(inti=0;i<26;i++)if(st[i])returni+'a';return-1;}charget_next(intt){for(inti=t+1;i<26;i++)if(st[i])return+'a';return-1;}intmain(){intT;scanf("%d",&T);while(T--){scanf("%d%d",&n,&k);scanf("%s",s1);memset(st,0,sizeofst);for(inti=0;in){printf("%s",s1);charc=get_min();for(inti=n;i=0;i--){charc=get_next(s1[i]-'a');if(c!=-1){s2[i]=c;for(intj=0;j