「杂题乱刷2」CF1493C
1.「算法笔记」构造选讲2.「杂题乱刷」CF1221B3.「杂题乱刷」CF468A4.「杂题乱刷」AT_abc337_e5.「杂题乱刷」洛谷 P88666.「杂题乱刷」CF1937C & CF1936A7.「杂题乱刷」CF1934D28.「杂题乱刷」at_abc092_d & AT_arc093_b9.「杂题乱刷」CF74E10.「杂题乱刷」AT_abc096_d11.「杂题乱刷」CF1973D12.「杂题乱刷」CF1977B13.「杂题乱刷」P827914.「杂题乱刷」P1067815.「杂题乱刷2」CF1015D Walking Between Houses16.「杂题乱刷2」CF1889A Qingshan Loves Strings 217.「杂题乱刷2」CF1567D
18.「杂题乱刷2」CF1493C
19.「杂题乱刷2」CF862C20.「杂题乱刷2」CF1365G21.「杂题乱刷2」AT_arc184_a22.「杂题乱刷2」CF1370F223.「杂题乱刷2」CF2040D24.「杂题乱刷2」CF1738F Connectivity Addicts25.「杂题乱刷2」CF109D题目链接
解题思路
首先,如果原字符串是合法的直接输出原字符串即可。
然后我们考虑一个最简单的暴力,你枚举第一个你构造的字符串比原串大的字符的位置,再枚举这个字符,然后后面的肯定是从后往前贪心放即可,在此不再赘述。
这样的复杂度是
考虑你从后缀往前扫,维护一个桶,每次向前一个字符只需要使用
时间复杂度
参考代码
点击查看代码
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define forll(i,a,b,c) for(re ll i=a;i<=b;i+=c)
#define forrr(i,a,b,c) for(re ll i=a;i>=b;i-=c)
#define pii pair<ll,ll>
#define mid ((l+r)>>1)
#define lowbit(x) (x&-x)
#define pb push_back
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
ll _t_;
void _clear(){}
ll n,m;
string s;
ll a[30];
ll pd;
string ans;
ll f(char x){
return x-'a'+1;
}
void check(ll x,char y)
{
a[f(y)]++;
ll need=0;
// forl(i,1,10)
// cout<<a[i]<<' ';
// cout<<endl;
forl(i,1,26)
need+=(m-a[i]%m)%m;
// cout<<need<<' '<<n<<' '<<x<<endl;
if(n-x<need)
{
a[f(y)]--;
return ;
}
pd=1;
ans="";
forl(i,0,n)
ans+=' ';
forl(i,1,x-1)
ans[i]=s[i];
ans[x]=y;
ll id=0;
forr(i,n,x+1)
{
ll pd2=0;
forr(j,26,1)
if(a[j]%m)
{
a[j]++,ans[i]=j+'a'-1;
pd2=1;
break;
}
if(!pd2)
{
id=i;
break;
}
}
forl(i,x+1,id)
ans[i]='a';
}
void solve()
{
ans="",pd=0;
_clear();
cin>>n>>m>>s;
if(n%m)
{
cout<<-1<<endl;
return ;
}
s=' '+s;
forl(i,1,26)
a[i]=0;
forl(i,1,n)
a[f(s[i])]++;
forl(i,1,26)
{
if(a[i]%m)
break;
if(i==26)
{
for(auto j:s)
if(j!=' ')
cout<<j;
cout<<endl;
return ;
}
}
/** a[f(s[4])]--;
a[f(s[3])]--;
a[f(s[2])]--;
check(2,'c');*/
forr(i,n,1)
{
a[f(s[i])]--;
forl(j,s[i]+1,'z')
{
check(i,j);
if(pd)
{
for(auto j:ans)
if(j!=' ')
cout<<j;
cout<<endl;
return ;
}
}
}
}
int main()
{
IOS;
_t_=1;
cin>>_t_;
while(_t_--)
solve();
QwQ;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效