Advertisement
K_Y_M_bl_C

Untitled

Feb 18th, 2017
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. string s, t;
  2. vpii ev[4000007];
  3. map<char, vi> lets, lett;
  4. map<char, char> tr;
  5. int T[4000007], SS[4000007];
  6. vi S;
  7. int z[4000007];
  8.  
  9. void calc()
  10. {
  11.     int n = s.size() + t.size() + 1;
  12.     int l = 0, r = 0;
  13.     for (int i = 1; i < n; ++i)
  14.     {
  15.         for (int j = 0; j < ev[i].size(); ++j)
  16.             SS[ev[i][j].X] = ev[i][j].Y;
  17.         if (i <= r)
  18.             z[i] = min(r - i + 1, z[i - l]);
  19.         while (i + z[i] < n && SS[z[i]] == SS[i + z[i]])
  20.             ++z[i];
  21.         if (i + z[i] - 1 > r)
  22.             l = i, r = i + z[i] - 1;
  23.     }
  24. }
  25.  
  26. int solve()
  27. {
  28.     getline(cin, s);
  29.     getline(cin, t);
  30.     fill(T, T + MAXN, -1);
  31.     fill(SS, SS + MAXN * 2, -1);
  32.     for (int i = 0; i < s.size() + t.size() + 1; ++i)
  33.         SS[i] = 0;
  34.     SS[t.size()] = -228;
  35.     forn(i, s.size())
  36.     {
  37.         if (!lets[s[i]].empty())
  38.         {
  39.             int l = lets[s[i]].back();
  40.             int r = i;
  41.             int len = (int)t.size();
  42.             if (l > r - len)
  43.             {
  44.                 if (r - len < 0)
  45.                     SS[l + len + 1] = r - l;
  46.                 else
  47.                     ev[r + 2].inb(mk(l + len + 1, r - l));
  48.             }
  49.         }
  50.         lets[s[i]].inb(i);
  51.     }
  52.     forn(i, t.size())
  53.     {
  54.         if (!lett[t[i]].empty())
  55.             SS[lett[t[i]].back()] = i - lett[t[i]].back();
  56.         lett[t[i]].inb(i);
  57.     }
  58.     calc();
  59.     int pos = -1;
  60.     for (int i = 0; i < s.size() + t.size() + 1; ++i)
  61.     {
  62.         if (z[i] == t.size())
  63.         {
  64.             pos = i - t.size() - 1;
  65.             break;
  66.         }
  67.     }
  68.     if (pos == -1)
  69.         puts("Impossible"), exit(0);
  70.     puts("Possible");
  71.     for (int i = pos; i < pos + t.size(); ++i)
  72.     {
  73.         tr[s[i]] = t[i - pos];
  74.     }
  75.     for (int i = 0; i < s.size(); ++i)
  76.     {
  77.         if (tr.find(s[i]) != tr.end())
  78.         {
  79.             cout << tr[s[i]];
  80.         }
  81.         else
  82.         {
  83.             cout << "?";
  84.         }
  85.     }
  86.     return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement