Advertisement
Guest User

Untitled

a guest
Oct 15th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. typedef int integer;
  4. #define int long long
  5. #define ll long long
  6. #define pb push_back
  7. #define mp make_pair
  8. #define EPS 1e-10
  9. #define SIZE(x) (int) x.size()
  10. #define INF 1000000000000LL
  11. #define mod 1000000007
  12. using namespace std;
  13.  
  14. vector<string> a;
  15. vector<string> am;
  16. vector<string> r;
  17. vector<string> rm;
  18.  
  19. bool comp(string& a, string& b){
  20. string c = a, d = b;
  21. for (int i = 0; i < c.length(); i++){
  22. c[a.length() - 1 - i] = a[i];
  23. }
  24. for (int i = 0; i < b.length(); i++){
  25. d[b.length() - 1 - i] = b[i];
  26. }
  27. return c < d;
  28. }
  29.  
  30. integer solve(integer index, bool m){
  31. if (!m && index == a.size()) return 0;
  32. if (m && index == am.size()) return 0;
  33. integer ans = solve(index + 1, m);
  34. if (!m){
  35. auto k = lower_bound(am.begin(), am.end(), a[index]);
  36. if (k != am.end()){
  37. string temp = a[index];
  38. reverse(temp.begin(), temp.end());
  39. k = lower_bound(rm.begin() + (k - am.begin()), rm.end(), temp, comp);
  40. if (k != rm.end()){
  41. temp = *k;
  42. reverse(temp.begin(), temp.end());
  43. k = lower_bound(am.begin(), am.end(), temp);
  44. ans = max(ans, 1 + solve(k - am.end(), !m));
  45. }
  46. }
  47. } else {
  48. auto k = lower_bound(a.begin(), a.end(), am[index]);
  49. if (k != a.end()){
  50. string temp = am[index];
  51. reverse(temp.begin(), temp.end());
  52. k = lower_bound(r.begin() + (k - a.begin()), r.end(), temp, comp);
  53. if (k != r.end()){
  54. temp = *k;
  55. reverse(temp.begin(), temp.end());
  56. k = lower_bound(a.begin(), a.end(), temp);
  57. ans = max(ans, 1 + solve(k - a.end(), !m));
  58. }
  59. }
  60. }
  61. return ans;
  62. }
  63.  
  64. integer main() {
  65. ios_base::sync_with_stdio(false);
  66.  
  67. int t;
  68. cin >> t;
  69. while (t--){
  70. int n;
  71. cin >> n;
  72. for (int i = 0; i < n; i++){
  73. string s;
  74. cin >> s;
  75. string rs = s;
  76. bool m = false;
  77. for (int j = 0; j < s.length(); j++){
  78. if (s[j] == 'm'){
  79. m = true;
  80. }
  81. rs[s.length() - 1 - j] = s[j];
  82. }
  83. if (m){
  84. am.pb(s);
  85. rm.pb(rs);
  86. } else {
  87. a.pb(s);
  88. r.pb(rs);
  89. }
  90. }
  91. sort(a.begin(), a.end());
  92. sort(am.begin(), am.end());
  93. sort(r.begin(), r.end(), comp);
  94. sort(rm.begin(), rm.end(), comp);
  95.  
  96. cout << solve(0, 0) << endl;
  97. cout << solve(0, 1) << endl;
  98.  
  99.  
  100. // for (int i = 0; i < r.size(); i++){
  101. // cout << r[i] << ' ';
  102. // }
  103. }
  104.  
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement