Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2018
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <deque>
  4. #include <map>
  5. #include <algorithm>
  6. #include <string>
  7. using namespace std;
  8. int pref_two(string a, string b) {
  9. int k = 0;
  10. while (a.size() > k && b.size() > k && a[k] == b[k]) {
  11. k++;
  12. }
  13. return k;
  14. }
  15. int main() {
  16. #pragma warning(disable :4996)
  17. #ifdef _DEBUG
  18. freopen("input.txt", "r", stdin);
  19. freopen("output.txt", "w", stdout);
  20. #endif
  21. int n;
  22. cin >> n;
  23. vector<string> name(n);
  24. vector<pair<string, int>> str(n);
  25. for (int i = 0; i < n; i++) {
  26. cin >> name[i];
  27. str[i] = make_pair(name[i], i);
  28. }
  29. sort(str.begin(), str.end());
  30. vector<int> pref1(n, 0);
  31. vector<vector<int>> pref(n, pref1);
  32. vector<int> pref_two_str(n - 1);
  33. for (int i = 0; i < n - 1; i++) {
  34. pref_two_str[i] = pref_two(str[i].first, str[i + 1].first);
  35. }
  36. for (int j = 0; j < n; j++) {
  37. for (int i = j - 1; i >= 0; i--) {
  38. if (i + 1 == j) {
  39. pref[str[i].second][str[j].second] = pref_two_str[i];
  40. pref[str[j].second][str[i].second] = pref_two_str[i];
  41. } else {
  42. pref[str[i].second][str[j].second] = min(pref_two_str[i],
  43. pref[str[i + 1].second][str[j].second]);
  44. pref[str[j].second][str[i].second] = pref[str[i].second][str[j].second];
  45. }
  46. }
  47. }
  48. vector<int> d1(n, 0);
  49. vector<vector<int>> d(n, d1);
  50.  
  51. for (int j = 0; j < n; j++) {
  52. for (int i = j - 1; i >= 0; i--) {
  53. if (i + 1 == j) {
  54. d[i][j] = pref[i][j] + 2;
  55. if (d[i][j] > name[j].size() + 1) {
  56. d[i][j] = 1e9;
  57. }
  58. } else {
  59. d[i][j] = max(pref[i][j] + 2, d[i + 1][j]);
  60. if (d[i][j] > name[j].size() + 1) {
  61. d[i][j] = 1e9;
  62. }
  63. }
  64. }
  65. }
  66. for (int j = 0; j < n; j++) {
  67. for (int i = n - 1; i >= j + 1; i--) {
  68. for (int y = 0; y < j; y++) {
  69. d[i][j] = max(d[i][j], pref[y][j] + 2);
  70. }
  71. if (i + 1 != n) {
  72. d[i][j] = max(pref[i][j] + 2, d[i + 1][j]);
  73. if (d[i][j] > name[j].size() + 1) {
  74. d[i][j] = 1e9;
  75. }
  76. }
  77. }
  78. }
  79. for (int i = 0; i < n - 1; i++) {
  80. d[i][i + 1] = 1;
  81. d[i + 1][i] = 1;
  82. }
  83. d[n - 1][0] = 1;
  84. d[0][n - 1] = 1;
  85. int k;
  86. cin >> k;
  87. vector<int> edit(k);
  88. for (int i = 0; i < k; i++) {
  89. cin >> edit[i];
  90. edit[i]--;
  91. }
  92. int s = 0;
  93. for (int i = 0; i < k; i++) {
  94. int f = edit[i];
  95. vector<int> p(n);
  96. map<pair<int, int>, int> dis;
  97. vector<int> dist(n);
  98. for (int j = 0; j < n; j++) {
  99. if (j == s) {
  100. dis[make_pair(0, s)] = 1;
  101. dist[s] = 0;
  102. } else {
  103. dis[make_pair(1e9, j)] = 1;
  104. dist[j] = 1e9;
  105. }
  106. }
  107. for (int j = 0; j < n; j++) {
  108. auto it = dis.begin();
  109. int min_ver = it->first.second;
  110. int length = it->first.first;
  111. dis.erase(make_pair(length, min_ver));
  112. for (int v1 = 0; v1 < n; v1++) {
  113. if (v1 != min_ver) {
  114. if (dist[v1] > length + d[min_ver][v1]) {
  115. dis.erase(make_pair(dist[v1], v1));
  116. dist[v1] = length + d[min_ver][v1];
  117. dis[make_pair(dist[v1], v1)] = 1;
  118. p[v1] = min_ver;
  119. }
  120. }
  121. }
  122. }
  123. cout << dist[f] << endl;
  124. if (dist[f] == 0) {
  125. cout << endl;
  126. }
  127. int x = f;
  128. vector<int> ans;
  129. while (x != s) {
  130. ans.push_back(x);
  131. x = p[x];
  132. }
  133. ans.push_back(x);
  134. vector<int> ans1(ans.size());
  135. for (int u = 0; u < ans.size(); u++) {
  136. ans1[u] = ans[ans.size() - u - 1];
  137. }
  138. for (int u = 0; u < ans1.size() - 1; u++) {
  139. int dl = d[ans1[u]][ans1[u + 1]];
  140. if (ans1[u] == ans1[u + 1] + 1) {
  141. cout << "up" << endl;
  142. } else {
  143. if (ans1[u] + 1 == ans1[u + 1]) {
  144. cout << "down" << endl;
  145. } else {
  146. if (ans1[u] < ans1[u + 1] && n - ans1[u + 1] + ans1[u] == 1) {
  147. cout << "up" << endl;
  148. } else {
  149. if (ans1[u] > ans1[u + 1] && n - ans1[u] + ans1[u + 1] == 1) {
  150. cout << "down" << endl;
  151. } else {
  152. cout << "Alt" << endl;
  153. for (int q = 0; q < d[ans1[u]][ans1[u + 1]] - 1; q++) {
  154. cout << name[ans1[u + 1]][q];
  155. }
  156. cout << endl;
  157. }
  158. }
  159. }
  160. }
  161. }
  162. s = f;
  163. }
  164. return 0;
  165. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement