Advertisement
Guest User

Untitled

a guest
Jun 18th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.27 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #define _USE_MATH_DEFINES
  3.  
  4. #include <iostream>
  5. #include <string>
  6. #include <vector>
  7. #include <cmath>
  8. #include <algorithm>
  9. #include <set>
  10. #include <map>
  11. #include <ctime>
  12. #include <cstring>
  13. #include <iomanip>
  14. #include <random>
  15. #include <unordered_set>
  16. #include <unordered_map>
  17. #include <deque>
  18. #include <queue>
  19. #include <bitset>
  20. #include <sstream>
  21.  
  22. using namespace std;
  23.  
  24. #define mp make_pair
  25. #define X first
  26. #define Y second
  27. #define all(x) x.begin(), x.end()
  28. #define all_(x) x.rbegin(), x.rend()
  29.  
  30. typedef unsigned int ui;
  31. typedef long long ll;
  32. typedef long double ld;
  33.  
  34. const int INF = 2e9 + 9;
  35. const int MAXN = 2e6 + 7;
  36. const ll MOD = 1e9 + 7;
  37. const ll ST = 157;
  38. const ll ST1 = 199;
  39. const ld EPS = 1e-9;
  40. const int BLOCK = 138;
  41.  
  42. void solve();
  43.  
  44. signed main(){
  45. srand('a' + 'l' + 'e' + 'x' + 'X' + '5' + '1' + '2');
  46. ios_base::sync_with_stdio(0);
  47. cin.tie(0);
  48. cout.tie(0);
  49. #ifdef _DEBUG
  50. freopen("input.txt", "r", stdin);
  51. freopen("output.txt", "w", stdout);
  52. #endif // _DEBUG
  53. solve();
  54. }
  55.  
  56. /*-------------------------------------------------------------------------------------------------------------*/
  57.  
  58. struct br{
  59. int v[26];
  60. int last;
  61. br(){
  62. memset(v, 255, sizeof v);
  63. last = -1;
  64. }
  65. };
  66.  
  67. vector<br> v;
  68. vector<int> ans;
  69. vector<pair<int, int>> parent;
  70. vector<pair<int, int>> suf;
  71. vector<string> vec;
  72.  
  73. void update(string &s, int ind){
  74. int now = 0;
  75. for (int i = 0; i < s.size(); i++){
  76. if (v[now].v[s[i] - 'a'] == -1){
  77. v.emplace_back();
  78. v[now].v[s[i] - 'a'] = v.size() - 1;
  79. }
  80. now = v[now].v[s[i] - 'a'];
  81. int uk = v[now].last + 1;
  82. if (ans[ind] > suf[uk].first + 1 + i + 1){
  83. ans[ind] = suf[uk].first + 1 + i + 1;
  84. parent[ind] = mp(suf[uk].second, i + 1);
  85. }
  86. v[now].last = ind;
  87. }
  88. }
  89.  
  90. void get(int l, int r, int n){
  91. v.clear();
  92. v.emplace_back();
  93. suf.clear();
  94. suf.assign(n, mp(0,0));
  95. parent.clear();
  96. parent.assign(n, mp(0, 0));
  97. ans.clear();
  98. ans.assign(n, 0);
  99. for (int i = 0; i < n; i++){
  100. suf[i] = mp(INF, i);
  101. ans[i] = INF;
  102. parent[i] = mp(0, -1);
  103. }
  104. ans[0] = 0;
  105. suf[0] = mp(0, 0);
  106. update(vec[l], 0);
  107. for (int i = 1; i < n; i++){
  108. ans[i] = ans[i - 1] + 1;
  109. parent[i] = mp(i - 1, -1);
  110. update(vec[(i + l) % n], i);
  111. suf[i] = mp(ans[i], i);
  112. for (int j = i - 1; j >= 0; j--){
  113. suf[j] = min(suf[j + 1], mp(ans[j], j));
  114. }
  115. }
  116. for (int j = n - 1; j >= 0; j--){
  117. if (ans[j]>ans[(j + 1) % n] + 1){
  118. ans[j] = ans[(j + 1) % n] + 1;
  119. parent[j] = mp((j + 1) % n, -2);
  120. }
  121. }
  122. vector<string> ans1;
  123. int uk = (r - l + n) % n;
  124. while (uk != 0){
  125. if (parent[uk].second > 0){
  126. for (int i = parent[uk].second - 1; i >= 0; i--){
  127. ans1.emplace_back();
  128. ans1.back().push_back(vec[(uk + l) % n][i]);
  129. }
  130. ans1.emplace_back("Alt");
  131. }
  132. else if (parent[uk].second == -1){
  133. ans1.emplace_back("down");
  134. }
  135. else{
  136. ans1.emplace_back("up");
  137. }
  138. uk = parent[uk].first;
  139. }
  140. cout << ans1.size() << "\n";
  141. for (int i = ans1.size() - 1; i >= 0; i--){
  142. cout << ans1[i] << "\n";
  143. }
  144. }
  145.  
  146. void solve(){
  147. int n;
  148. cin >> n;
  149. for (int i = 0; i < n; i++){
  150. string s;
  151. cin >> s;
  152. vec.emplace_back(s);
  153. }
  154. int last = 0, k;
  155. cin >> k;
  156. for (int i = 0; i < k; i++){
  157. int a;
  158. cin >> a;
  159. get(last, a - 1, n);
  160. last = a - 1;
  161. }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement