Guest User

Untitled

a guest
May 22nd, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 3.25 KB | None | 0 0
  1. program z9;
  2.  
  3. {$APPTYPE CONSOLE}
  4. {$R+}
  5.  
  6. uses
  7.   SysUtils;
  8.  
  9. type
  10.   un = record
  11.     s: string;
  12.     o: boolean;
  13.   end;
  14.  
  15. var
  16.   s, res: string;
  17.   a: array[0..200001] of un;
  18.   i, c, x, y, z, w, sp, fn: integer;
  19.  
  20. function func(x, m: integer): integer;
  21. begin
  22.   if a[x].s <> '?' then
  23.     func := length(a[x].s)
  24.   else
  25.     func := m;
  26. end;
  27.  
  28. function len(m: integer): integer;
  29. var
  30.   i, fn: integer;
  31.   rs: int64;
  32. begin
  33.   rs := func(1, m);
  34.   for i := 2 to c do begin
  35.     fn := func(i, m);
  36.     if a[i - 1].o then
  37.       rs := fn * rs + rs
  38.     else
  39.       rs := rs + fn;
  40.     if rs > maxint then begin
  41.       len := maxint;
  42.       exit;
  43.     end;
  44.   end;
  45.   len := rs;
  46. end;
  47.  
  48. function bin(n: integer): integer;
  49. var
  50.   l, r, m, x, ln: integer;
  51. begin
  52.   l := 1;
  53.   r := n;
  54.   x := length(res);
  55.   while r > l do begin
  56.     m := (l + r) div 2;
  57.     ln := len(m);
  58.     if ln < x then
  59.       l := m + 1
  60.     else
  61.       if ln > x then
  62.         r := m
  63.       else begin
  64.         bin := m;
  65.         exit;
  66.       end;
  67.   end;
  68.   bin := l;
  69. end;
  70.  
  71. begin
  72.   reset(input, 'input.txt');
  73.   rewrite(output, 'output.txt');
  74.  
  75.   readln(s);
  76.   res := '';
  77.   i := 1;
  78.   c := 0;
  79.   while s[i] <> '=' do begin
  80.     if not (s[i] in ['*', '+']) then
  81.       res := res + s[i]
  82.     else begin
  83.       inc(c);
  84.       a[c].s := res;
  85.       res := '';
  86.       if s[i] = '*' then
  87.         a[c].o := true
  88.       else
  89.         a[c].o := false;
  90.     end;
  91.     inc(i);
  92.   end;
  93.   a[0].o := true;
  94.   a[c + 1].o := true;
  95.  
  96.  
  97.   inc(c);
  98.   a[c].s := res;
  99.  
  100.   res := copy(s, i + 1, length(s) - i);
  101.   x := bin(length(res));
  102.  
  103.   i := 1;
  104.   while a[i].s <> '?' do
  105.     inc(i);
  106.   y := i;
  107.  
  108.   dec(i);
  109.   while (i >= 1) and a[i].o  do
  110.     dec(i);
  111.   z := i;
  112.  
  113.   i := y;
  114.   while (i <= c) and a[i].o do
  115.     inc(i);
  116.   w := i;
  117.  
  118.   sp := 0;
  119.   for i := y + 1 to c do
  120.     if a[i - 1].o then
  121.       if (sp = 0) then
  122.         sp := func(i, x)
  123.       else
  124.         sp := (sp + 1) * func(i, x) + sp;
  125.  
  126.   if (w = y) and ((z + 1) = w) and ((z + 1) = y) then
  127.     if a[1].s = '?' then begin
  128.       fn := 1;
  129.       for i := 1 to x do begin
  130.         write(res[fn]);
  131.         inc(fn, sp + 1)
  132.       end;
  133.       halt(0);
  134.     end
  135.     else begin
  136.       w := length(a[1].s);
  137.       for i := 2 to y - 1 do
  138.         if a[i - 1].o then
  139.           w := w * length(a[i].s) + w
  140.         else
  141.           w := length(a[i].s) + w;
  142.       for i := y + 1 to c do
  143.         if a[i - 1].o then
  144.           w := w * func(i, x) + w;
  145.       fn := 1;
  146.       for i := 1 to x do begin
  147.         write(res[w + fn]);
  148.         inc(fn, sp + 1);
  149.       end;
  150.       halt(0);
  151.     end;
  152.  
  153.   if a[1].s = '?' then begin
  154.     fn := 1;
  155.     for i := 1 to x do begin
  156.       write(res[fn]);
  157.       inc(fn, sp + 1);
  158.     end;
  159.     halt(0);
  160.   end;
  161.  
  162.   if a[y - 1].o then begin
  163.     fn := 1;
  164.     for i := 1 to x do begin
  165.       write(res[fn + sp + 1]);
  166.       inc(fn, sp + 1);
  167.     end;
  168.     halt(0);
  169.   end;
  170.  
  171.   z := length(a[1].s);
  172.   for i := 2 to y - 1 do
  173.     if a[i - 1].o then
  174.       z := z * length(a[i].s) + z
  175.     else
  176.       z := z + length(a[i].s);
  177.  
  178.   for i := y + 1 to c do
  179.     if a[i - 1].o then
  180.       z := z * func(i, x) + z;
  181.  
  182.   fn := 1;
  183.   for i := 1 to x do begin
  184.     write(res[z + fn]);
  185.     inc(fn, sp + 1);
  186.   end;
  187.  
  188.   close(input);
  189.   close(output);
  190. end.
Add Comment
Please, Sign In to add comment