大一十五周周赛F题
没啥可说的了,已经是第二次做了,还错,那就挂到这里好好看看吧。
题目:
输入:
输出:
样例:
——————————————————————————————————————
都做过一回了,竟然还照着老方法去写,好好反省反省。
题意:
给你一串字符,再给你a,b,分别代表0和1的数量,其中有?,请你把问号替换为0或1,从而最后构成一个回文串。
——————————————————————————————————————
错误代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char f[500010];
int main()
{
int t,a,b,i,j,l,x,y;
scanf("%d",&t);
while(t--)
{
memset(f,'\0',sizeof(f));
scanf("%d%d",&a,&b);
scanf("%s",f);
l=a+b;
/*if(a%2==1&&b%2==1)
{
printf("-1\n");
continue;
}*/
for(i=0;i<l;i++)
{
if(f[i]=='0')
a--;
else if(f[i]=='1')
b--;
}
for(i=0;i<l;i++)
{
x=i;
y=l-1-i;
if(x==y)
{
if(f[x]=='?')
{
if(a>0)
{
a--;
f[x]='0';
}
else if(b>0)
{
b--;
f[x]='1';
}
}
continue;
}
if((f[x]=='0'&&f[y]=='?')||(f[x]=='?'&&f[y]=='0'))
{
if(a>0)
{
a--;
f[x]=f[y]='0';
}
}
else if((f[x]=='1'&&f[y]=='?')||(f[x]=='?'&&f[y]=='1'))
{
if(b>0)
{
b--;
f[x]=f[y]='1';
}
}
else if(f[x]=='?'&&f[y]=='?')
{
if(a>=2)
{
a-=2;
f[x]=f[y]='0';
}
else if(b>=2)
{
b-=2;
f[x]=f[y]='1';
}
}
/*else
{
if(f[x]!=f[y])
break;
}*/
}
for(i=0;i<l;i++)
{
x=i;
y=l-1-i;
if(f[x]=='?'||f[y]=='?')
break;
if(f[x]!=f[y])
break;
}
if(a!=0||b!=0)
{
printf("-1\n");
continue;
}
if(i==l)
{
printf("%s\n",f);
}
else
{
printf("-1\n");
}
}
return 0;
}
正确代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char f[500010];
int main()
{
int t,a,b,i,j,l,x,y;
scanf("%d",&t);
while(t--)
{
memset(f,'\0',sizeof(f));
scanf("%d%d",&a,&b);
scanf("%s",f);
l=a+b;
for(i=0;i<l;i++)
{
if(f[i]=='0')
a--;
else if(f[i]=='1')
b--;
}
for(i=0;i<l;i++)
{
x=i;
y=l-1-i;
if((f[x]=='0'&&f[y]=='?')||(f[x]=='?'&&f[y]=='0'))
{
if(a>0)
{
a--;
f[x]=f[y]='0';
}
}
else if((f[x]=='1'&&f[y]=='?')||(f[x]=='?'&&f[y]=='1'))
{
if(b>0)
{
b--;
f[x]=f[y]='1';
}
}
}
for(i=0;i<l;i++)
{
x=i;
y=l-1-i;
if(f[x]=='?'&&f[y]=='?')
{
if(a>=2)
{
a-=2;
f[x]=f[y]='0';
}
else if(b>=2)
{
b-=2;
f[x]=f[y]='1';
}
}
}
if(l%2==1)
{
if(a>0)
{
a--;
f[l/2]='0';
}
else if(b>0)
{
b--;
f[l/2]='1';
}
}
for(i=0;i<l;i++)
{
x=i;
y=l-1-i;
if(f[x]=='?'||f[y]=='?')
break;
if(f[x]!=f[y])
break;
}
if(a!=0||b!=0)
{
printf("-1\n");
continue;
}
if(i==l)
{
printf("%s\n",f);
}
else
{
printf("-1\n");
}
}
return 0;
}