P1942 词编码题解
题目大意:给你若干个只含
思路:模拟。若该字符串长度比
代码(非常易读)
#include<bits/stdc++.h>
using namespace std;
int n;
int ans=0,anss=0,aa,bj;
int k=0,ww=-1,www=-1;
int main(){
cin>>n;
string s;
while(cin>>s){
ans=0,anss=0,bj=0;
k=0,ww=-1,www=-1,aa=0;
if(s.size()==n){//进行操作1或4
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
ans=ans+i+1;
}
}
if(ans%(n+1)==0&&bj==0){//操作4
for(int i=0;i<s.size();i++){
cout<<s[i];
}
bj=1;
}
else{//操作1
int wz=-1;
for(int i=s.size()-1;i>=0;i--){
if(s[i]=='1'){
int aa=ans-(i+1);
if(aa%(n+1)==0){
wz=i;
}
}
}
if(wz!=-1){
for(int i=0;i<wz;i++){
cout<<s[i];
}
cout<<'0';
for(int i=wz+1;i<=s.size();i++)
cout<<s[i];
bj=1;
}
}
if(bj==1)
cout<<endl;
}
else if(s.size()<n){//进行操作2了
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
ans++;
anss=anss+i+1;
}
}
// cout<<anss;
for(int i=0;i<=s.size();i++){//1被删了
int aa=ans-k+anss;
if(aa%(n+1)==0){
ww=i;
break;
}
if(s[i]=='1')
k++;
}
k=0;
for(int i=0;i<=s.size();i++){//0被删了
int aa=ans-k+anss;
if((aa+i+1)%(n+1)==0){
www=i;
break;
}
if(s[i]=='1')
k++;
//cout<<aa<<endl;
}
if(ww!=-1){
for(int i=0;i<ww;i++){
cout<<s[i];
}
cout<<'0';
for(int i=ww;i<s.size();i++){
cout<<s[i];
}
bj=1;
}
else if(www!=-1){
for(int i=0;i<www;i++){
cout<<s[i];
}
cout<<'1';
for(int i=www;i<s.size();i++){
cout<<s[i];
}
bj=1;
}
if(bj==1)
cout<<endl;
}
else if(s.size()>n){//进行操作3了
for(int i=0;i<s.size();i++){
if(s[i]=='1'){
ans++;
anss=anss+i+1;
}
}
//cout<<anss;
for(int i=0;i<=s.size();i++){//枚举要删的数
if(s[i]=='1'){
aa=anss-i-1;
k++;
aa-=(ans-k);
if(aa%(n+1)==0){
// cout<<anss<<' '<<ans<<' '<<k<<endl;
ww=i;
break;
}
}
else{
aa=anss-(ans-k);
if(aa%(n+1)==0){
ww=i;
// cout<<aa<<endl;
break;
}
}
}
//cout<<ww;
if(ww!=-1){
for(int i=0;i<ww;i++){
cout<<s[i];
}
for(int i=ww+1;i<s.size();i++){
cout<<s[i];
}
cout<<endl;
bj=1;
}
}
if(bj==0){//无解
cout<<"-1"<<endl;
}
}
return 0;
}
/*
5
101101
*/