constint M = 20000, N = 2000, C = 26, TM = C * C * C, TN = C * C; intgh(char a, char b){ return a * C + b; } intgh(char a, char b, char c){ return a * C * C + b * C + c; }
ll w[M], wn[N], sw[N], tw[N]; vector<pair<int, ll> > G[N]; ll dis[N]; int cnt[N]; bool instk[N]; intmain(){ int n; int res = -2e9; cin >> n; for (int i = 1; i <= n; i++) { char s[4]; int v; cin >> (s + 1) >> v; int l = strlen(s + 1); for (int i = 1; i <= l; i++) s[i] -= 'a'; if (l == 1) { res = max(res, v); for (int i = 0; i < C; i++) { wn[gh(s[1], i)] += v; tw[gh(i, s[1])] += v; } } elseif (l == 2) { wn[gh(s[1], s[2])] -= v; for (int i = 0; i < C; i++) { w[gh(i, s[1], s[2])] += v; w[gh(s[1], s[2], i)] += v; } sw[gh(s[1], s[2])] += v; tw[gh(s[1], s[2])] += v; } else { w[gh(s[1], s[2], s[3])] += v; } }
for (int i = 0; i < TM; i++) { G[i / C + TN].push_back({i % (C * C), w[i]}); } int s = TN * 2 + 1, t = s + 1; for (int i = 0; i < TN; i++) { G[i].push_back({i + TN, wn[i]}); G[s].push_back({i, sw[i]}); G[i + TN].push_back({t, tw[i]}); }
queue<int> q; memset(cnt, 0, sizeof(cnt)); memset(dis, -0x3f, sizeof(dis)); q.push(s); dis[s] = 0; instk[s] = true; while (q.size()) { int u = q.front(); q.pop(); cnt[u]++; instk[u] = false; if (cnt[u] > TN + 10) { cout << "Infinity" << endl; return0; } for (pair<int, ll> e : G[u]) { ll v = e.first, w = e.second; if (dis[v] < dis[u] + w) { dis[v] = dis[u] + w; if (!instk[v]) { instk[v] = true; q.push(v); } } } }