ENG  RUSTimus Online Judge
Online Judge
Problems
Authors
Online contests
About Online Judge
Frequently asked questions
Site news
Webboard
Links
Problem set
Submit solution
Judge status
Guide
Register
Update your info
Authors ranklist
Current contest
Scheduled contests
Past contests
Rules
back to board

Discussion of Problem 1007. Code Words

Please help me!!!!!
Posted by Happybird 10 Jan 2003 13:46
Who can tell me why I got WA?

const Max=1005;
var
  N:integer;
procedure work;
  var
    work_i,work_j,work_k,modi_j,work_temp1,work_temp2:integer;
    this_str,Modi_chr:char;
    work_s:longint;
    data_str:array[1..Max] of char;
    work_save:array[0..max] of integer;
  begin
    readln(N);work_i:=0;
    while not eof do begin
      work_s:=0;work_j:=0;
      fillchar(work_save,sizeof(work_save),0);
      fillchar(data_str,sizeof(data_str),'0');
      while not eoln do begin
        read(this_str);
        if this_str<>' ' then begin
          inc(work_j);data_str[work_j]:=this_str;
          work_save[work_j]:=ord(this_str)-48;
          if work_save[work_j]=1 then work_s:=work_s+work_j;
        end;
      end;
      if work_j>0 then begin
        work_temp1:=work_save[work_j];work_save[work_j]:=0;
        for work_k:=work_j-1 downto 0 do begin
          work_temp2:=work_temp1;
          work_temp1:=work_save[work_k];
          work_save[work_k]:=work_save[work_k+1]+work_temp2;
        end;
        if work_j<N then begin
                           work_k:=0;Modi_j:=0;
                           repeat
                             inc(work_k);
                             if (work_s+work_save[work_k-1]) mod (n+1)
=0 then begin
                                 Modi_j:=work_k;modi_chr:='0';
                               end
                             else if (work_s+work_k+work_save[work_k-
1])mod(n+1)=0 then begin
                                    modi_j:=work_k;modi_chr:='1';
                                  end;
                           until Modi_j>0;
                         end
        else if work_j>N then begin
                                work_k:=0;Modi_j:=0;
                                repeat
                                  inc(work_k);
                                  if data_str[work_k]='1' then if
(work_s-work_save[work_k]-work_k) mod (n+1)=0 then

modi_j:=work_k
                                                           else
                                  else if (work_s-work_save[work_k])
mod(n+1)=0 then modi_j:=work_k;
                                until Modi_j>0;
                              end
             else begin
                    work_k:=0;modi_j:=0;modi_chr:='0';
                    repeat
                      inc(work_k);
                      if data_str[work_k]='1' then if (work_s-work_k)
mod (n+1)=0 then modi_j:=work_k;
                    until work_k>N;
                  end;
        for work_k:=1 to Modi_j-1 do write(data_str[work_k]);
        if (work_j<=n)and(modi_j>0) then write(modi_chr);
        if (work_j<N)and(modi_j<N) then write(data_str[modi_j]);
        for work_k:=modi_j+1 to work_j do write(data_str[work_k]);
        writeln;
      end;
      readln;
    end;
  end;
begin
  work;
end.

Thanks!!!!
I am not good at Pascal, I hope my c++ code will help you a little.
Posted by Standlove 10 Jan 2003 14:28
You just need to test all the possiblities.
if len_of_word == N check if it's right or relace 0 with 1
if len_of_word == N-1 check one symbol is missing
if len_of_word == N+1 check one symbol is added


#include <iostream>
#include <cstring>
using namespace std;

const int MAX_N = 1001;
char word[MAX_N];
int ones[MAX_N];
int N;

void Print(int st, int ed)
{
    for (int i = st; i <= ed; ++i) {
        cout << word[i];
    }
}

int main()
{
    cin >> N;
    while (1) {
        char ch;
        int idx = 0;
        if (!(cin >> ch)) return 0;
        while (ch != '\n') {
            if (ch == '0' || ch == '1')
                word[idx++] = ch;
            if (!cin.get(ch)) return 0;
        }
        word[idx] = '\0';
        memset(ones, 0, sizeof(ones));

        int len = strlen(word);
        int total = 0;
        for (int i = 0; i < len; ++i) {
            if (word[i] == '1') {
                total += (i+1);
                ones[i] = 1;
            }
        }
        for (int i = len-2; i >= 0; --i) {
            ones[i] += ones[i+1];
        }
        // the word is right
        if (len == N && total % (N+1) == 0) {
            cout << word << endl;
            continue;
        }
        // Any symbol 0 is replaced by 1
        if (len == N) {
            for (int i = 0; i < len; ++i) {
                if (word[i] == '1' && (total-(i+1))%(N+1) == 0) {
                    word[i] = '0';
                    cout << word;
                    break;
                }
            }
        }
        else // Any symbol is removed
        if (len == N-1) {
            // insert an 0 or 1 before pos i
            for (int i = 0; i <= len; ++i) {
                if ( (total+ones[i])%(N+1) == 0 ) {
                    Print(0, i-1);
                    cout << '0';
                    Print(i, len-1);
                    break;
                }
                else if ( (total+ones[i]+(i+1))%(N+1) == 0) {
                    Print(0, i-1);
                    cout << '1';
                    Print(i, len-1);
                    break;
                }
            }
        }
        else  // A symbol is inserted at any position
        if (len == N+1) {
            for (int i = 0; i < len; ++i) {
                if ((word[i] == '1' && (total-ones[i+1]-(i+1))%(N+1)
== 0) ||
                    (word[i] == '0' && (total-ones[i+1])%(N+1) == 0))
                {
                    Print(0, i-1);
                    Print(i+1, len-1);
                    break;
                }
            }
        }
        cout << endl;
    }
    //
    return 0;
}