Advertisement
agul

CF Entry 3589

Jan 10th, 2012
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 1.53 KB | None | 0 0
  1. {$MODE DELPHI}
  2. {$R+,S+,Q+,I+,C+,M+,H+,O+}
  3. {R-,S-,Q-,I-,C-,M-,H-,O+}
  4.  
  5. uses
  6.     SysUtils, Math;
  7.  
  8. var
  9.     i, ls : longint;
  10.     s, t : string;
  11.  
  12. function test(t : string) : boolean;
  13.  
  14. var
  15.     i, j, p, lt, cj, k : longint;
  16.     ok : boolean;
  17.  
  18. begin
  19.     result := false;
  20.     lt := length(t);
  21.     t := t + '$$$';
  22.     j := 1;
  23.     i := 0;
  24.     while i < ls do begin
  25.         inc(i);
  26.         if s[i] = '?' then begin
  27.             if j > lt then exit;
  28.             inc(j);
  29.         end else
  30.         if s[i] = '*' then begin
  31.             p := 0;
  32.             while s[i + 1] = '?' do begin
  33.                 inc(i);
  34.                 inc(p);
  35.             end;
  36.             if i > ls then begin
  37.                 result := lt - j + 1 >= p;
  38.                 exit;
  39.             end else begin
  40.                 inc(i);
  41.                 if i > ls then begin
  42.                     result := true;
  43.                     exit;
  44.                 end;
  45.                 inc(j, p);
  46.                 if j > lt then exit;
  47.                 while j <= lt do begin
  48.                     ok := true;
  49.                     cj := j;
  50.                     for k := i to ls do begin
  51.                         if cj > lt then exit;
  52.                         if (s[k] <> '?') and (s[k] <> t[cj]) then begin
  53.                             inc(j);
  54.                             ok := false;
  55.                             while (j <= lt) and (t[j] <> s[i]) do inc(j);
  56.                             if j > lt then exit;
  57.                             break;
  58.                         end;
  59.                         inc(cj);
  60.                     end;
  61.                     if ok and (cj - lt = 1) then begin
  62.                         result := true;
  63.                         exit;
  64.                     end else
  65.                     if ok and (k >= ls) then begin
  66.                         inc(j);
  67.                         continue;
  68.                     end;
  69.                 end;
  70.             end;
  71.         end else
  72.         if (j > lt) or (s[i] <> t[j]) then exit else inc(j);
  73.     end;
  74.     result := j - lt = 1;
  75. end;
  76.  
  77. begin
  78.     readln(s);
  79.     ls := length(s);
  80.     s := s + '$$$';
  81.     for i := 1 to 5 do begin
  82.         readln(t);
  83.         if test(t) then writeln('YES') else writeln('NO');
  84.     end;
  85. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement