Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <deque>
- #include <map>
- #include <algorithm>
- #include <string>
- using namespace std;
- int pref_two(string a, string b) {
- int k = 0;
- while (a.size() > k && b.size() > k && a[k] == b[k]) {
- k++;
- }
- return k;
- }
- int main() {
- #pragma warning(disable :4996)
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- int n;
- cin >> n;
- vector<string> name(n);
- vector<pair<string, int>> str(n);
- for (int i = 0; i < n; i++) {
- cin >> name[i];
- str[i] = make_pair(name[i], i);
- }
- sort(str.begin(), str.end());
- vector<int> pref1(n, 0);
- vector<vector<int>> pref(n, pref1);
- vector<int> pref_two_str(n - 1);
- for (int i = 0; i < n - 1; i++) {
- pref_two_str[i] = pref_two(str[i].first, str[i + 1].first);
- }
- for (int j = 0; j < n; j++) {
- for (int i = j - 1; i >= 0; i--) {
- if (i + 1 == j) {
- pref[str[i].second][str[j].second] = pref_two_str[i];
- pref[str[j].second][str[i].second] = pref_two_str[i];
- } else {
- pref[str[i].second][str[j].second] = min(pref_two_str[i],
- pref[str[i + 1].second][str[j].second]);
- pref[str[j].second][str[i].second] = pref[str[i].second][str[j].second];
- }
- }
- }
- vector<int> d1(n, 0);
- vector<vector<int>> d(n, d1);
- for (int j = 0; j < n; j++) {
- for (int i = j - 1; i >= 0; i--) {
- if (i + 1 == j) {
- d[i][j] = pref[i][j] + 2;
- if (d[i][j] > name[j].size() + 1) {
- d[i][j] = 1e9;
- }
- } else {
- d[i][j] = max(pref[i][j] + 2, d[i + 1][j]);
- if (d[i][j] > name[j].size() + 1) {
- d[i][j] = 1e9;
- }
- }
- }
- }
- for (int j = 0; j < n; j++) {
- for (int i = n - 1; i >= j + 1; i--) {
- for (int y = 0; y < j; y++) {
- d[i][j] = max(d[i][j], pref[y][j] + 2);
- }
- if (i + 1 != n) {
- d[i][j] = max(pref[i][j] + 2, d[i + 1][j]);
- if (d[i][j] > name[j].size() + 1) {
- d[i][j] = 1e9;
- }
- }
- }
- }
- for (int i = 0; i < n - 1; i++) {
- d[i][i + 1] = 1;
- d[i + 1][i] = 1;
- }
- d[n - 1][0] = 1;
- d[0][n - 1] = 1;
- int k;
- cin >> k;
- vector<int> edit(k);
- for (int i = 0; i < k; i++) {
- cin >> edit[i];
- edit[i]--;
- }
- int s = 0;
- for (int i = 0; i < k; i++) {
- int f = edit[i];
- vector<int> p(n);
- map<pair<int, int>, int> dis;
- vector<int> dist(n);
- for (int j = 0; j < n; j++) {
- if (j == s) {
- dis[make_pair(0, s)] = 1;
- dist[s] = 0;
- } else {
- dis[make_pair(1e9, j)] = 1;
- dist[j] = 1e9;
- }
- }
- for (int j = 0; j < n; j++) {
- auto it = dis.begin();
- int min_ver = it->first.second;
- int length = it->first.first;
- dis.erase(make_pair(length, min_ver));
- for (int v1 = 0; v1 < n; v1++) {
- if (v1 != min_ver) {
- if (dist[v1] > length + d[min_ver][v1]) {
- dis.erase(make_pair(dist[v1], v1));
- dist[v1] = length + d[min_ver][v1];
- dis[make_pair(dist[v1], v1)] = 1;
- p[v1] = min_ver;
- }
- }
- }
- }
- cout << dist[f] << endl;
- if (dist[f] == 0) {
- cout << endl;
- }
- int x = f;
- vector<int> ans;
- while (x != s) {
- ans.push_back(x);
- x = p[x];
- }
- ans.push_back(x);
- vector<int> ans1(ans.size());
- for (int u = 0; u < ans.size(); u++) {
- ans1[u] = ans[ans.size() - u - 1];
- }
- for (int u = 0; u < ans1.size() - 1; u++) {
- int dl = d[ans1[u]][ans1[u + 1]];
- if (ans1[u] == ans1[u + 1] + 1) {
- cout << "up" << endl;
- } else {
- if (ans1[u] + 1 == ans1[u + 1]) {
- cout << "down" << endl;
- } else {
- if (ans1[u] < ans1[u + 1] && n - ans1[u + 1] + ans1[u] == 1) {
- cout << "up" << endl;
- } else {
- if (ans1[u] > ans1[u + 1] && n - ans1[u] + ans1[u + 1] == 1) {
- cout << "down" << endl;
- } else {
- cout << "Alt" << endl;
- for (int q = 0; q < d[ans1[u]][ans1[u + 1]] - 1; q++) {
- cout << name[ans1[u + 1]][q];
- }
- cout << endl;
- }
- }
- }
- }
- }
- s = f;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement