Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- string s, t;
- vpii ev[4000007];
- map<char, vi> lets, lett;
- map<char, char> tr;
- int T[4000007], SS[4000007];
- vi S;
- int z[4000007];
- void calc()
- {
- int n = s.size() + t.size() + 1;
- int l = 0, r = 0;
- for (int i = 1; i < n; ++i)
- {
- for (int j = 0; j < ev[i].size(); ++j)
- SS[ev[i][j].X] = ev[i][j].Y;
- if (i <= r)
- z[i] = min(r - i + 1, z[i - l]);
- while (i + z[i] < n && SS[z[i]] == SS[i + z[i]])
- ++z[i];
- if (i + z[i] - 1 > r)
- l = i, r = i + z[i] - 1;
- }
- }
- int solve()
- {
- getline(cin, s);
- getline(cin, t);
- fill(T, T + MAXN, -1);
- fill(SS, SS + MAXN * 2, -1);
- for (int i = 0; i < s.size() + t.size() + 1; ++i)
- SS[i] = 0;
- SS[t.size()] = -228;
- forn(i, s.size())
- {
- if (!lets[s[i]].empty())
- {
- int l = lets[s[i]].back();
- int r = i;
- int len = (int)t.size();
- if (l > r - len)
- {
- if (r - len < 0)
- SS[l + len + 1] = r - l;
- else
- ev[r + 2].inb(mk(l + len + 1, r - l));
- }
- }
- lets[s[i]].inb(i);
- }
- forn(i, t.size())
- {
- if (!lett[t[i]].empty())
- SS[lett[t[i]].back()] = i - lett[t[i]].back();
- lett[t[i]].inb(i);
- }
- calc();
- int pos = -1;
- for (int i = 0; i < s.size() + t.size() + 1; ++i)
- {
- if (z[i] == t.size())
- {
- pos = i - t.size() - 1;
- break;
- }
- }
- if (pos == -1)
- puts("Impossible"), exit(0);
- puts("Possible");
- for (int i = pos; i < pos + t.size(); ++i)
- {
- tr[s[i]] = t[i - pos];
- }
- for (int i = 0; i < s.size(); ++i)
- {
- if (tr.find(s[i]) != tr.end())
- {
- cout << tr[s[i]];
- }
- else
- {
- cout << "?";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement