Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- using ll = long long;
- using ld = long double;
- using ull = unsigned long long;
- using pii = pair<int, int>;
- using pll = pair<ll, ll>;
- using pld = pair<ld, ld>;
- #define fi first
- #define se second
- #define pb push_back
- #define pf push_front
- #define mp make_pair
- #define ins insert
- #define btpc __builtin_popcount
- #define btclz __builtin_clz
- #define sz(x) (int)(x.size());
- #define all(x) x.begin(), x.end()
- #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] "
- mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1};
- int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1};
- template<class X, class Y>
- bool minimize(X &x, const Y &y) {
- if (x > y)
- {
- x = y;
- return true;
- }
- return false;
- }
- template<class X, class Y>
- bool maximize(X &x, const Y &y) {
- if (x < y)
- {
- x = y;
- return true;
- }
- return false;
- }
- const int MOD = 1e9 + 7; //998244353
- template<class X, class Y>
- void add(X &x, const Y &y) {
- x = (x + y);
- if(x >= MOD) x -= MOD;
- }
- template<class X, class Y>
- void sub(X &x, const Y &y) {
- x = (x - y);
- if(x < 0) x += MOD;
- }
- /* Author : Le Ngoc Bao Anh, 11A5, LQD High School for Gifted Student*/
- const ll INF = 1e9;
- const int N = 3e5 + 10;
- struct TrieNode {
- TrieNode* child[26];
- ll dp = 0;
- TrieNode() {
- for(int i = 0; i < 26; i++) child[i] = nullptr;
- dp = 0;
- }
- };
- string s[N];
- int p[N];
- vector<int> g[N], imp[N], nimp[N];
- bool is_imp[N];
- ll dp[N], f[N], b[N];
- void solve() {
- int n, m; cin >> n >> m;
- for(int i = 1; i <= n; i++) {
- cin >> s[i] >> p[i];
- }
- int S = 600;
- TrieNode* root = new TrieNode();
- auto updateTrie = [&](string s, ll x) -> void {
- int n = s.size();
- TrieNode* curr = root;
- for(int i = 0; i < n; i++) {
- int p = (s[i] - 'A');
- if(curr->child[p] == nullptr) curr->child[p] = new TrieNode();
- curr = curr->child[p];
- if(i + 1 < n) maximize(curr->dp, x);
- }
- };
- auto getTrie = [&](string s) -> ll {
- int n = s.size();
- TrieNode* curr = root;
- for(int i = 0; i < n; i++) {
- int p = (s[i] - 'A');
- if(curr->child[p] == nullptr) curr->child[p] = new TrieNode();
- curr = curr->child[p];
- }
- return curr->dp;
- };
- for(int i = 1; i <= m; i++) {
- int u, v; cin >> u >> v;
- g[u].pb(v);
- g[v].pb(u);
- }
- int t = 1e5;
- for(int i = 1; i <= t; i++) {
- sort(all(g[i]));
- g[i].resize(unique(all(g[i])) - g[i].begin());
- }
- for(int i = 1; i <= t; i++) {
- is_imp[i] = (g[i].size() >= S);
- }
- for(int i = 1; i <= t; i++) {
- for(auto u : g[i]) {
- if(is_imp[u]) imp[i].pb(u);
- else nimp[i].pb(u);
- }
- }
- ll ans = 0;
- for(int i = 1; i <= n; i++) {
- dp[i] = getTrie(s[i]) + p[i];
- int u = p[i];
- maximize(dp[i], f[u] + u);
- for(auto v : imp[u]) maximize(dp[i], b[v] + p[i]);
- if(is_imp[u]) maximize(b[u], dp[i]);
- else {
- for(auto v : g[u]) maximize(f[v], dp[i]);
- }
- updateTrie(s[i], dp[i]);
- maximize(ans, dp[i]);
- }
- cout << ans;
- }
- int main()
- {
- ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #else
- //online
- #endif
- int tc = 1, ddd = 0;
- // cin >> tc;
- while(tc--) {
- //ddd++;
- //cout << "Case #" << ddd << ": ";
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement