Advertisement
K_Y_M_bl_C

Untitled

Feb 1st, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.91 KB | None | 0 0
  1. #ifdef _DEBUG
  2. #define _GLIBCXX_DEBUG
  3. #endif
  4. #define _CRT_SECURE_NO_WARNINGS
  5. #include <ext/pb_ds/assoc_container.hpp>
  6. #include <bits/stdc++.h>
  7.  
  8. using namespace __gnu_pbds;
  9. using namespace std;
  10.    
  11. typedef long long ll;
  12. typedef vector<ll> vll;
  13. typedef pair<int, int> pii;
  14. typedef vector<int> vi;
  15. typedef long double ld;
  16. typedef tree<pair<ll, int>, null_type, less<pair<ll, int>>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
  17.    
  18. #define mk make_pair
  19. #define inb push_back
  20. #define enb emplace_back
  21. #define X first
  22. #define Y second
  23. #define all(v) v.begin(), v.end()
  24. #define sqr(x) (x) * (x)
  25. #define TIME 1.0 * clock() / CLOCKS_PER_SEC
  26. #define y1 AYDARBOG
  27. //continue break pop_back return
  28.    
  29. int solve();
  30.    
  31. int main()
  32. {
  33.     //ios_base::sync_with_stdio(0);
  34.     //cin.tie(0);
  35. #define TASK "treedp"
  36. #ifndef _DEBUG
  37.     //freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  38. #endif
  39.     solve();
  40. #ifdef _DEBUG
  41.     fprintf(stderr, "\nTIME: %.3f\n", TIME);
  42. #endif
  43. }
  44.    
  45. const int INF = 2e9 + 7;
  46. const ll LINF = 1e18;
  47.  
  48. const int BUFSZ = (int)1e6 + 7;
  49. char buf[BUFSZ];
  50. string get_str()
  51. {
  52.     scanf(" %s", buf);
  53.     return string(buf);
  54. }
  55.  
  56. struct edge
  57. {
  58.     int a, b, c;
  59.     edge() {};
  60.     edge(int a, int b, int c) : a(a), b(b), c(c) {};
  61. };
  62.  
  63. int solve()
  64. {
  65.     int n, m, t;
  66.     scanf("%d %d %d", &n, &m, &t);
  67.     vector<vector<pair<int, char>>> g(n);
  68.     vector<pair<int, char>> p(n);
  69.     p[0] = mk(-1, '0');
  70.     for (int i = 1; i < n; ++i)
  71.     {
  72.         int x;
  73.         char c;
  74.         scanf("%d %c", &x, &c);
  75.         --x;
  76.         g[x].inb(mk(i, c));
  77.     }
  78.     map<string, ll> cst;
  79.     map<string, int> ids;
  80.     for (int i = 0; i < m; ++i)
  81.     {
  82.         ll w;
  83.         string s;
  84.         scanf("%lld", &w);
  85.         s = get_str();
  86.         if (s.size() < n)
  87.         {
  88.             reverse(all(s));
  89.             if (cst.find(s) == cst.end() || cst[s] > w)
  90.                 cst[s] = w, ids[s] = i + 1;
  91.         }
  92.     }
  93.     vector<vll> dp(n);
  94.     vector<vector<vector<edge>>> rec(n);
  95.     vi cur;
  96.     string cs;
  97.     function<void(int)> calc = [&](int u)
  98.     {
  99.         cur.inb(u);
  100.         int sz = g[u].size();
  101.         dp[u].assign(cur.size(), LINF);
  102.         rec[u].resize(cur.size());
  103.         for (int i = 0; i < sz; ++i)
  104.         {
  105.             int to = g[u][i].X;
  106.             cs.inb(g[u][i].Y);
  107.             calc(to);
  108.             cs.pop_back();
  109.         }
  110.         //printf("VERT: %d\n", u + 1);
  111.         if (!g[u].empty())
  112.         {
  113.             vector<vll> dp1(sz, vll(cur.size(), LINF));
  114.             vector<vector<vector<edge>>> rec1(sz, vector<vector<edge>>(cur.size()));
  115.             dp1[0] = dp[g[u][0].X];
  116.             rec1[0] = rec[g[u][0].X];
  117.             for (int i = 1; i < sz; ++i)
  118.             {
  119.                 int to = g[u][i].X;
  120.                 for (int h = 0; h < cur.size(); ++h)
  121.                 {
  122.                     for (int h1 = cur.size() - 1; h1 >= 0; --h1)
  123.                     {
  124.                         if (dp[to][h1] == LINF)
  125.                             break;
  126.                         if (dp1[i][min(h, h1)] > dp1[i - 1][h] + dp[to][h1])
  127.                         {
  128.                             dp1[i][min(h, h1)] = dp1[i - 1][h] + dp[to][h1];
  129.                             rec1[i][min(h, h1)] = rec1[i - 1][h];
  130.                             for (auto x : rec[to][h1])
  131.                                 rec1[i][min(h, h1)].inb(x);
  132.                         }
  133.                     }
  134.                 }
  135.                 /*dp1[i ^ 1].assign(dp[i].size(), LINF);
  136.                 rec1[i ^ 1].clear();
  137.                 rec1[i ^ 1].resize(dp[i].size());*/
  138.             }
  139.             dp[u] = dp1[sz - 1];
  140.             rec[u] = rec1[sz - 1];
  141.         }
  142.         else
  143.         {
  144.             dp[u][cur.size() - 1] = 0;
  145.         }
  146.         string str = cs;
  147.         reverse(all(str));
  148.         //cout << str << "\n";
  149.         for (int i = 0; i < cs.size(); ++i)
  150.         {
  151.             ll w = LINF;
  152.             if (cst.find(str) != cst.end())
  153.                 w = cst[str];
  154.             if (w != LINF)
  155.             {
  156.                 int id = ids[str], len = str.size();
  157.                 for (int j = i; j < cur.size(); ++j)
  158.                 {
  159.                     if (dp[u][i] > dp[u][j] + w)
  160.                     {
  161.                         dp[u][i] = dp[u][j] + w;
  162.                         rec[u][i] = rec[u][j];
  163.                         rec[u][i].inb(edge(cur[cur.size() - len - 1] + 1, u + 1, id));
  164.                     }
  165.                 }
  166.             }
  167.             str.pop_back();
  168.         }
  169.         cur.pop_back();
  170.         for (int i = 1; i < (int)dp[u].size(); ++i)
  171.         {
  172.             if (dp[u][i - 1] < dp[u][i])
  173.             {
  174.                 dp[u][i] = dp[u][i - 1];
  175.                 rec[u][i] = rec[u][i - 1];
  176.             }
  177.         }
  178.         /*for (int i = 0; i < (int)dp[u].size(); ++i)
  179.             printf("%lld ", dp[u][i]);
  180.         puts("");//*/
  181.     };
  182.     calc(0);
  183.     printf("%lld\n", (dp[0][0] != LINF) ? dp[0][0] : -1);
  184.     if (dp[0][0] != LINF && t == 1)
  185.     {
  186.         printf("%d\n", (int)rec[0][0].size());
  187.         for (auto x : rec[0][0])
  188.             printf("%d %d %d\n", x.a, x.b, x.c);
  189.     }
  190.     return 0;
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement