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

Обсуждение задачи 1684. Последнее слово Джека

WA 3!
Послано Felix_Mate 2 янв 2016 14:59
const Nmax=1000000;
var
 s:array[0..Nmax-1] of char;
 z,ans,rans:array[0..Nmax-1] of longint;
 N,M,i,L,R,last,len:longint;
 ch:char;

function min(x,y:longint):longint;
begin
 if(x>y) then x:=y;
 min:=x;
end;

procedure Init;
begin
 N:=-1;
 read(ch);
 while(ord(ch)>=ord('a'))and(ord(ch)<=ord('z')) do begin
  inc(N);
  s[N]:=ch;
  read(ch);
 end;
 readln;

 inc(N);
 M:=0;
 s[N]:='#';
 read(ch);
 while(ord(ch)>=ord('a'))and(ord(ch)<=ord('z')) do begin
  inc(N);
  inc(M);
  s[N]:=ch;
  read(ch);
 end;
end;

BEGIN
 Init;

 z[0]:=N;
 L:=0;
 R:=0;

 for i:=1 to N do
 begin
  if(i<=R) then z[i]:=min(z[i-l],R-i+1)
  else z[i]:=0;
   while(i+z[i]<=N)and(s[i+z[i]]=s[z[i]]) do inc(z[i]);
   if(i+z[i]-1>R)and(z[i]>0) then begin
    R:=i+z[i]-1;
    L:=i;
   end;
 end;

 len:=0;
 last:=N;
 R:=0;
 i:=N;
 while(i>=N-M) do begin
  if(z[i]>=last-i+1) then begin
   inc(r);
   ans[r]:=i;
   rans[r]:=last;
   inc(len,last-i+1);
   last:=i-1;
  end;
  dec(i);
 end;

 if(len<M) then writeln('Yes')
 else begin
  writeln('No');
  for i:=r downto 1 do begin
   for l:=ans[i] to rans[i] do write(s[l]);
   write(' ');
  end;
 end;
END.

В чём баг хз.Уже сколько пытаюсь сдать-всегда WA3!
Решал так:s1 и s2-входные строки,создаю строку s1#s2,вычисляю z-функцию для s=s1#s2,иду с конца строки до символа # и пытаюсь "покрыть" "не покрытые" символы. Если всю строку покрыл,то ответ No,иначе Yes