1037: 倍流畅序列
时间限制: 1 Sec 内存限制: 128 MB提交: 232 解决: 90
[ 提交][ 状态][ 讨论版]
题目描述
对于一个0、1串s, 从左端开始读取它的0获得序列s0,从右端开始读取它的1获得s1,如果s1与s2同构,则称s为倍流畅序列.
例如:
011001是一个倍流畅序列, 因为:
s0 = 0__00_
s1 = 1__11_
而101不是, 因为:
s0 = _0_
s1 = 1_1
下面的问题是:对于一个0、1串s, 在s后添加最少数目的0或1,使它成为一个倍流畅序列。
输入
有多组输入数据,第一行为一个数字T,代表有T组输入数据 (0<T<=100)。
接下来为T组数据,每组数据占一行,包含一个长度不超过50的0、1串。
输出
一共T行。
对于每组数据,在一行上输出添加了最少数目的0或1后所得到的倍流畅序列。
样例输入
3
100
0011
010
样例输出
100110
0011
0101
思路:其实就是找一个中心轴,使得中心轴的两边01对称分布。不断向右移动轴,直到缺的位置确定,再补全缺的0和1即可~
上代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
char chuan[110];
scanf("%d",&n);
// getchar();
while(n--)
{
scanf("%s",chuan);
int len=strlen(chuan);
if(len%2==0)
{
int u=0;
int z;
while(1)
{
int zhou=(len-1)/2+u;
if(zhou==len-1)
{
z=zhou;
break;
}
int flag=1;
for(int j=0;zhou+j+1<=len-1;j++)
{
if(chuan[zhou-j]-'0'+chuan[zhou+j+1]-'0'!=1)
flag=0;
}
if(flag==1)
{
z=zhou;
break;
}
u++;
}
if(z==(len-1)/2)
puts(chuan);
else
{
int k;
//int v=0;
for(k=2*(z+1)-1;k>=len;k--)
{
chuan[k]='1'-chuan[2*(z+1)-1-k]+'0';
}
chuan[2*(z+1)]='\0';
puts(chuan);
}
}
if(len%2==1)
{
int u=0;
int z;
while(1)
{
int zhou=(len-1)/2+u;
if(zhou==len-1)
{
z=zhou;
break;
}
int flag=1;
for(int j=0;zhou+j+1<=len-1;j++)
{
if(chuan[zhou-j]-'0'+chuan[zhou+j+1]-'0'!=1)
flag=0;
}
if(flag==1)
{
z=zhou;
break;
}
u++;
}
int k;
for(k=2*(z+1)-1;k>=len;k--)
{
chuan[k]='1'-chuan[2*(z+1)-1-k]+'0';
}
chuan[2*(z+1)]='\0';
puts(chuan);
}
}
return 0;
}