题意简述
每个小写字母对应其 ASCII 的 位二进制,其中 的个数在 到 之间。长为 的小写串映射成 位 01 串后被打乱,给出打乱结果,还原任意一个原串,无解输出 NIE。
解题思路
打乱不改变 的总个数,所以只需让还原串里各字母「 的个数」之和等于给定串里 的个数 。
每个字母贡献 到 个 ,分别可取 a()、c()、g()、o()。 个字母之和落在 ,故 或 时无解。
否则先全填 a(和为 ),还差 个 要补;从左到右每个字母最多再加 (即升到 o),贪心补完即可。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
string t;
cin>>n>>t;
int cnt=count(t.begin(),t.end(),'1');
if(cnt<3*n||cnt>6*n)
{
cout<<"NIE\n";
return 0;
}
cnt-=3*n;
string mp="acgo",s;
for(int i=0;i<n;i++)
{
int d=min(cnt,3);
cnt-=d;
s+=mp[d];
}
cout<<s<<'\n';
return 0;
}