码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1147 Binary codes

时间:2015-06-23 09:51:26      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:

Binary codes
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 5647   Accepted: 2201

Description

Consider a binary string (b1…bN) with N binary digits. Given such a string, the matrix of Figure 1 is formed from the rotated versions of the string.

b1 b2 … bN?1 bN
b2 b3 … bN b1
…
bN?1 bN … bN?3 bN?2
bN b1 … bN?2 bN?1

Figure 1. The rotated matrix

Then rows of the matrix are sorted in alphabetical order, where ‘0’ is before ‘1’. You are to write a program which, given the last column of the sorted matrix, finds the first row of the sorted matrix.

As an example, consider the string (00110). The sorted matrix is

0 0 0 1 1
0 0 1 1 0
0 1 1 0 0
1 0 0 0 1
1 1 0 0 0

and the corresponding last column is (1 0 0 1 0). Given this last column your program should determine the first row, which is (0 0 0 1 1).

Input

The first line contains one integer N ≤ 3000, the number of binary digits in the binary string. The second line contains N integers, the binary digits in the last column from top to bottom.

Output

The first line contains N integers: the binary digits in the first row from left to right.

Sample Input

5
1 0 0 1 0

Sample Output

0 0 0 1 1


对由0,1组成的n个数,照题中的旋转,最后依据每行的字典序排序,组成n*n的矩阵,给出矩阵的最后1列。求矩阵

的第首行。

给出最后一列能够求出第0列,由于是按字典序排的,所以第0列肯定0在前,1在后,而第0列为0的相对位置在最后

1列不变。由于第0列都为0,又是按字典序排的。第0列为1也一样。依据第0列和最后一列就能够将相应关系求出。

也就是next数组。

比如例子的

0 0 0 1 1

0 0 1 1 0

0 1 1 0 0

1 0 0 0 1

1 1 0 0 0

next[ ]={1,2,4,0,3}

第0行第0列为0,第0行的第1列下次旋转后为第0列的第0行,所以第0行第1列为第0列的第1行为0。第1列的第0行

为第2列的第1行。为第0列的第2行,所以第0行的第2列为第0列的第2行为0,通过推理发现为next数组中元素递推

代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=5000+100;
int last[maxn];
int first[maxn];
int next[maxn];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        for(int i=0;i<n;i++)
        {
           scanf("%d",&last[i]);
           first[i]=last[i];
        }
        sort(first,first+n);
        int cur=0;
        int i;
        for(i=0;i<n;i++)
        {
            if(first[i])
            break;
            while(last[cur]&&cur<n)
            cur++;
            next[i]=cur++;
        }
        cur=0;
        for(i=i;i<n;i++)
        {
            while(last[cur]==0&&cur<n)
            cur++;
            next[i]=cur++;
        }
        int  k=0;
        for(int i=0;i<n-1;i++)
        {
           printf("%d ",first[k]);
           k=next[k];
        }
        printf("%d\n",first[k]);
    }
    return 0;
}


poj 1147 Binary codes

标签:

原文地址:http://www.cnblogs.com/bhlsheji/p/4594557.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!