TopCoder Practice SRMs — SRM 144 DIV 1 — 300p

來源:互聯網
上載者:User
文章目錄
  • Problem Statement
  • Definition
  • Constraints
  • Examples
Problem Statement
 

Let's say you have a binary string such as the following:

011100011

One way to encrypt this string is to add to each digit the sum of its adjacent digits. For example, the above string would become:

123210122

In particular, if P is the original string, and Q is the encrypted string, thenQ[i] = P[i-1] + P[i] + P[i+1] for all digit positionsi. Characters off the left and right edges of the string are treated as zeroes.

An encrypted string given to you in this format can be decoded as follows (using123210122 as an example):

  1. Assume P[0] = 0.
  2. Because Q[0] = P[0] + P[1] = 0 + P[1] = 1, we know that P[1] = 1.
  3. Because Q[1] = P[0] + P[1] + P[2] = 0 + 1 + P[2] = 2, we know that
    P[2] = 1.
  4. Because Q[2] = P[1] + P[2] + P[3] = 1 + 1 + P[3] = 3, we know that
    P[3] = 1.
  5. Repeating these steps gives us P[4] = 0, P[5] = 0, P[6] = 0,P[7] = 1, andP[8] = 1.
  6. We check our work by noting that Q[8] = P[7] + P[8] = 1 + 1 = 2. Since this equation works out, we are finished, and we have recovered one possible original string.

Now we repeat the process, assuming the opposite about P[0]:

  1. Assume P[0] = 1.
  2. Because Q[0] = P[0] + P[1] = 1 + P[1] = 0, we know that P[1] = 0.
  3. Because Q[1] = P[0] + P[1] + P[2] = 1 + 0 + P[2] = 2, we know that
    P[2] = 1.
  4. Now note that Q[2] = P[1] + P[2] + P[3] = 0 + 1 + P[3] = 3, which leads us to the conclusion thatP[3] = 2. However, this violates the fact that each character in the original string must be '0' or '1'. Therefore, there exists no such original
    stringP where the first digit is '1'.

Note that this algorithm produces at most two decodings for any given encrypted string. There can never be more than one possible way to decode a string once the first binary digit is set.

Given a string message, containing the encrypted string, return a vector <string> with exactly two elements. The first element should contain the decrypted string assuming the first character is '0'; the second element should assume the
first character is '1'. If one of the tests fails, return the string "NONE" in its place. For the above example, you should return{"011100011", "NONE"}.

Definition
 
Class: BinaryCode
Method: decode
Parameters: string
Returns: vector <string>
Method signature: vector <string> decode(string message)
(be sure your method is public)
 
 
Constraints
- message will contain between 1 and 50 characters, inclusive.
- Each character in message will be either '0', '1', '2', or '3'.
Examples
0)  
 
"123210122"
Returns: { "011100011",  "NONE" }

The example from above.

1)  
 
"11"
Returns: { "01",  "10" }

We know that one of the digits must be '1', and the other must be '0'. We return both cases.

2)  
 
"22111"
Returns: { "NONE",  "11001" }

Since the first digit of the encrypted string is '2', the first two digits of the original string must be '1'. Our test fails when we try to assume thatP[0] = 0.

3)  
 
"123210120"
Returns: { "NONE",  "NONE" }

This is the same as the first example, but the rightmost digit has been changed to something inconsistent with the rest of the original string. No solutions are possible.

4)  
 
"3"
Returns: { "NONE",  "NONE" }
 
5)  
 
"12221112222221112221111111112221111"
Returns: { "01101001101101001101001001001101001",  "10110010110110010110010010010110010" }
 

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.
    

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<string>
#include<vector>
#include<iostream>
using std::string;
using std::vector;
using std::cout;
using std::endl;

class BinaryCode
{
public:
    vector<string> decode(string message);
};

void push_result(int flag, vector<string> &re, const string &message)
{
    unsigned int length = message.length();
    string result(length, ' ');
    if (flag == 0)
        result[0] = '0';
    else if (flag == 1)
        result[0] = '1';
    else
        cout << "Flag must be 1 or 0 !" << endl;
    result[1] = message[0] - result[0]  + 48 ;
    int i;
    for (i = 2; i < length; i++)
    {
        result[i] = message[i - 1] - result[i - 1] - result[i - 2] + 96;
        if (result[i] != 48  &&  result[i] != 49 )
            break;
    }
    if (i == length)
    {
        if (message[length - 1] == result[length - 1] + result[length - 2] - 48)
        {
            re.push_back(result);
        }
        else
            re.push_back("NULL");
    }
    else
        re.push_back("NULL");
}

vector<string>  BinaryCode::decode(string message)
{
    vector<string> re;
    push_result(0, re, message);
    push_result(1, re, message);
    return re;
}

新手,可能做的時間較長且效率也不咋地,只有90多分。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.