Salvens

B

Aug 10th, 2023
879
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.53 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <array>
  4. #include <vector>
  5. #include <numeric>
  6. #include <random>
  7. #include <chrono>
  8. #include <set>
  9.  
  10.  
  11. using namespace std;
  12.  
  13. #define int long long
  14. #pragma comment(linker,"/STACK:1000000000,1000000000")
  15.  
  16. const long long INF = 1e9 + 7;
  17. const int MAXN = 1e4 + 5;
  18. const int N = 1e5 + 10;
  19.  
  20. struct vertex {
  21.     int next[26];
  22.     int terminal = 0;
  23.     string t;
  24. } v[MAXN];
  25.  
  26. int root = 0, top = 1;
  27.  
  28. void add(const string& s, int num) {
  29.     int cur = root;
  30.     for (auto& i: s) {
  31.         int x = i - 'a';
  32.         if (v[cur].next[x] == 0) {
  33.             v[cur].next[x] = top++;
  34.         }
  35.         cur = v[cur].next[x];
  36.     }
  37.     v[cur].terminal = num;
  38.     v[cur].t = s;
  39. }
  40.  
  41. array<vector<pair<int, string>>, MAXN> dp;
  42.  
  43. bool comp(const pair<int, string>& lhs, const pair<int, string>& rhs) {
  44.     return lhs.first > rhs.first || lhs.first == rhs.first && lhs.second < rhs.second;
  45. }
  46.  
  47. void dfs(int ver) {
  48.     for (int i = 0; i < 26; ++i) {
  49.         if (v[ver].next[i] != 0) {
  50.             dfs(v[ver].next[i]);
  51.             for (auto& elem: dp[v[ver].next[i]]) {
  52.                 dp[ver].emplace_back(elem);
  53.             }
  54.             sort(dp[ver].begin(), dp[ver].end(), comp);
  55.             while (dp[ver].size() > 10) {
  56.                 dp[ver].pop_back();
  57.             }
  58.         }
  59.     }
  60.     if (v[ver].terminal != 0) {
  61.         dp[ver].emplace_back(v[ver].terminal, v[ver].t);
  62.     }
  63. }
  64.  
  65. vector<vector<string>> answers;
  66.  
  67. void get(const string& s) {
  68.     int cur = root;
  69.     for (auto& i: s) {
  70.         int x = i - 'a';
  71.         cur = v[cur].next[x];
  72.     }
  73.     if (cur == 0) {
  74.         return;
  75.     }
  76.     sort(dp[cur].begin(), dp[cur].end(), comp);
  77.     while (dp[cur].size() > 10) {
  78.         dp[cur].pop_back();
  79.     }
  80.     answers.emplace_back(vector<string>());
  81.     for (auto [num, hint]: dp[cur]) {
  82.         answers.back().emplace_back(hint);
  83.     }
  84. }
  85.  
  86. signed main() {
  87.     ios_base::sync_with_stdio(false);
  88.     cin.tie(nullptr);
  89.     cout.tie(nullptr);
  90.  
  91.     int n;
  92.     cin >> n;
  93.     for (int i = 0; i < n; ++i) {
  94.         string s;
  95.         int num;
  96.         cin >> s >> num;
  97.         add(s, num);
  98.     }
  99.  
  100.     dfs(0);
  101.  
  102.     int m;
  103.     cin >> m;
  104.     for (int i = 0; i < m; ++i) {
  105.         string s;
  106.         cin >> s;
  107.         get(s);
  108.     }
  109.  
  110.     for (int i = 0; i < answers.size(); ++i) {
  111.         for (int j = 0; j < answers[i].size(); ++j) {
  112.             cout << answers[i][j] << '\n';
  113.         }
  114.         if (i != answers.size() - 1) {
  115.             cout << '\n';
  116.         }
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment