ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1007. Кодовые слова

Please help me!!!!!
Послано Happybird 10 янв 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.
Послано Standlove 10 янв 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;
}