Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <utility>
- #include <algorithm>
- #include <deque>
- #include <string>
- #include <unordered_map>
- #include <cstdio>
- using namespace std;
- const int INF = 2e9;
- long long sum = 0;
- vector<int> used;
- vector<pair<pair<int, int>, int>> answer;
- bool cmp (pair<string, int>& left, pair<string, int>& right) {
- return left.first.length() > right.first.length();
- }
- void dfs(vector<vector<pair<int, int>>>& pr, vector<vector<int>>& dp, vector<vector<pair<int, char>>>& g, vector<pair<int, char>>& obr, vector<vector<int>>& tok, int now) {
- for (auto next : g[now]) {
- if (dp[now][next.first] == INF) {
- sum = 1e18;
- return;
- } else {
- if (used[next.first] == 1) {
- int r = pr[now][next.first].second;
- int l = pr[now][next.first].first;
- sum += dp[now][next.first];
- answer.push_back({{l, r}, tok[now][next.first]});
- while (r >= now) {
- used[r] = 0;
- r = obr[r].first;
- }
- }
- dfs(pr, dp, g, obr, tok, next.first);
- }
- }
- }
- void uf(vector<pair<string, int>>& s, vector<vector<int>>& sd, vector<int>& now, vector<vector<pair<int, char>>>& g, string& yea, int e) {
- now.push_back(e);
- if (g[e].size() == 0) {
- s.push_back({yea, s.size()});
- sd.push_back(now);
- }
- for (auto next : g[e]) {
- yea.push_back(next.second);
- uf(s, sd, now, g, yea, next.first);
- yea.pop_back();
- }
- now.pop_back();
- }
- int main()
- {
- freopen("input.txt", "r", stdin);
- int n, m, t;
- cin >> n >> m >> t;
- vector<vector<pair<int, char>>> g(n + 1);
- vector<pair<int, char>> obr(n + 1);
- for (int i = 2; i <= n; ++i) {
- int x;
- char c;
- cin >> x >> c;
- g[x].push_back({i, c});
- obr[i].first = x;
- obr[i].second = c;
- }
- unordered_map<string, pair<int, int>> about;
- vector<string> buf;
- for (int i = 1; i <= m; ++i) {
- int x;
- cin >> x;
- string s;
- cin >> s;
- if (about[s].first != 0 && x < about[s].first || about[s].first == 0) {
- about[s].first = x;
- about[s].second = i;
- }
- buf.push_back(s);
- }
- sort(buf.begin(), buf.end());
- vector<string> main;
- main.push_back(*buf.begin());
- for (int i = 1; i < m; ++i) {
- if (main.back() != buf[i]) {
- main.push_back(buf[i]);
- }
- }
- vector<vector<int>> dp(n + 1, vector<int> (n + 1, INF));
- vector<vector<pair<int, int>>> pr(n + 1, vector<pair<int, int>> (n + 1));
- vector<vector<int>> tok(n + 1, vector<int> (n + 1));
- vector<vector<int>> len(n + 1, vector<int> (n + 1));
- vector<vector<int>> sd;
- vector<pair<string, int>> s;
- vector<int> now;
- string yea;
- uf(s, sd, now, g, yea, 1);
- sort(s.begin(), s.end(), cmp);
- for (int i = 0; i < s.size(); ++i) {
- for (int l = s[i].first.length(); l >= 1; ++l) {
- for (int j = 0; j < s[i].first.length() - l; ++j) {
- string buf_ = s[i].first.substr(j, l);
- auto it_1 = lower_bound(main.begin(), main.end(), buf_), it_2 = upper_bound(main.begin(), main.end(), buf_);
- if (it_1 != main.end() && ++it_1 != it_2) {
- for (int start = j + l; start > j; --j) {
- if (dp[sd[s[i].second][start - 1]][sd[s[i].second][start]] > about[buf_].first ||
- dp[sd[s[i].second][start - 1]][sd[s[i].second][start]] == about[buf_].first &&
- len[sd[s[i].second][start - 1]][sd[s[i].second][start]] < buf_.length()) {
- dp[sd[s[i].second][start - 1]][sd[s[i].second][start]] = about[buf_].first;
- pr[sd[s[i].second][start - 1]][sd[s[i].second][start]].first = sd[s[i].second][j];
- pr[sd[s[i].second][start - 1]][sd[s[i].second][start]].second = sd[s[i].second][j + l];
- len[sd[s[i].second][start - 1]][sd[s[i].second][start]] = buf_.length();
- tok[sd[s[i].second][start - 1]][sd[s[i].second][start]] = about[buf_].second;
- }
- }
- }
- }
- }
- }
- used.resize(n + 1, 1);
- dfs(pr, dp, g, obr, tok, 1);
- if (sum > 1e17) {
- cout << -1;
- } else {
- cout << sum;
- if (t == 1) {
- cout << "\n" << answer.size() << "\n";
- for (int i = 0; i < answer.size(); ++i) {
- cout << answer[i].first.first << " " << answer[i].first.second << " " << answer[i].second << "\n";
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement