func_code_string: #include <bits/stdc++.h>   using namespace std;   long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }   struct KMP {     int n, at;     string s;     vector<int> nxt;     vector<int> nxtdiff;     void init(int _n) {       n = _n, at = 0, s = string(n,  ? ), nxt = nxtdiff = vector<int>(n + 1, 0);     }     void add(char c) {       s[at++] = c;       int x = nxt[at - 1];       while (x != 0 && s[x] != c) x = nxt[x];       if (at >= 2 && s[x] == c) ++x;       nxt[at] = x;       nxtdiff[at - 1] = s[nxt[at - 1]] != c ? nxt[at - 1] : nxtdiff[nxt[at - 1]];     }   };   struct RMQ {     int n;     vector<int> val;     void init(int _n) {       n = _n;       val = vector<int>(4 * n, 0);     }     void _set(int x, int l, int r, int IDX, int VAL) {       if (l == r) {         val[x] = VAL;       } else {         int m = l + (r - l) / 2;         if (IDX <= m)           _set(2 * x + 1, l, m, IDX, VAL);         else           _set(2 * x + 2, m + 1, r, IDX, VAL);         val[x] = min(val[2 * x + 1], val[2 * x + 2]);       }     }     void set(int idx, int v) { _set(0, 0, n - 1, idx, v); }     int _get(int x, int l, int r, int L, int R) {       if (L <= l && r <= R) {         return val[x];       } else {         int m = l + (r - l) / 2, ret = INT_MAX;         if (L <= m) ret = min(ret, _get(2 * x + 1, l, m, L, R));         if (m + 1 <= R) ret = min(ret, _get(2 * x + 2, m + 1, r, L, R));         return ret;       }     }     int get(int l, int r) { return _get(0, 0, n - 1, l, r); }   };   const int BASE = 1000000000;   const int BASEDIGITS = 9;   struct BigInt {     vector<int> val;     BigInt() {}   };   void print(const BigInt &a) {     if (((int)(a.val).size()) == 0) {       printf( 0 );       return;     }     for (int i = ((int)(a.val).size()) - 1; i >= 0; --i) {       if (i == ((int)(a.val).size()) - 1)         printf( %d , a.val[i]);       else         printf( %0*d , BASEDIGITS, a.val[i]);     }   }   BigInt operator+(const BigInt &a, unsigned long long b) {     BigInt c = a;     for (int i = 0; b > 0; ++i) {       if (i >= ((int)(c.val).size())) c.val.push_back(0);       b += c.val[i];       c.val[i] = b % BASE;       b /= BASE;     }     return c;   }   BigInt operator+(const BigInt &a, const BigInt &b) {     BigInt c;     int carry = 0;     for (int i = 0;          i < ((int)(a.val).size()) || i < ((int)(b.val).size()) || carry > 0;          ++i) {       if (i < ((int)(a.val).size())) carry += a.val[i];       if (i < ((int)(b.val).size())) carry += b.val[i];       c.val.push_back(carry % BASE);       carry /= BASE;     }     return c;   }   BigInt operator-(const BigInt &a, unsigned long long b) {     BigInt c = a;     for (int i = 0; b > 0; ++i) {       assert(i < ((int)(c.val).size()));       int cur = b % BASE;       b /= BASE;       if (cur <= c.val[i])         c.val[i] -= cur;       else         c.val[i] += BASE - cur, ++b;     }     while (((int)(c.val).size()) > 0 && c.val.back() == 0) c.val.pop_back();     return c;   }   int operator%(const BigInt &a, int b) {     int ret = 0;     for (int i = ((int)(a.val).size()) - 1; i >= 0; --i)       ret = ((unsigned long long)ret * BASE + a.val[i]) % b;     return ret;   }   int operator&(const BigInt &a, int b) { return (a % (1 << 30)) & b; }   struct RelaxableSet {     BigInt sum;     map<int, int> cnt;     void init() {       sum = BigInt();       cnt = map<int, int>();     }     void relax(int lim) {       int rem = 0;       while (((int)(cnt).size()) > 0) {         auto it = prev(cnt.end());         if (it->first <= lim) break;         sum = sum - (unsigned long long)it->first * it->second, rem += it->second,         cnt.erase(it);       }       if (rem > 0) cnt[lim] += rem, sum = sum + (unsigned long long)lim * rem;     }     void remove(int val) {       auto it = cnt.find(val);       assert(it != cnt.end());       if (it->second == 1)         cnt.erase(it);       else         --it->second;       sum = sum - val;     }     void add(int val) {       ++cnt[val];       sum = sum + val;     }     void print() {       for (auto it = cnt.begin(); it != cnt.end(); ++it)         printf(  %d=%d , it->first, it->second);       puts(  );     }   };   const int MAXN = 600000;   const int MASK = (1 << 30) - 1;   int n;   char c[MAXN];   int w[MAXN];   BigInt ans[MAXN];   KMP kmp;   RMQ rmq;   RelaxableSet have;   void solve() {     kmp.init(n);     rmq.init(n);     have.init();     BigInt prv;     for (int i = (0); i < (n); ++i) {       char cc = (prv + (unsigned long long)(c[i] -  a )) % 26 +  a ;       int ww = w[i] ^ (prv & MASK);       kmp.add(cc);       int len = i;       while (len >= 1) {         if (kmp.s[len] != cc) {           int val = rmq.get(i - len, i - 1);           have.remove(val);           len = kmp.nxt[len];         } else {           len = kmp.nxtdiff[len];         }       }       rmq.set(i, ww);       have.relax(ww);       if (cc == kmp.s[0]) have.add(ww);       ans[i] = prv + have.sum;       prv = ans[i];     }   }   void run() {     scanf( %d , &n);     for (int i = (0); i < (n); ++i) scanf(  %c%d , &c[i], &w[i]);     solve();     for (int i = (0); i < (n); ++i) print(ans[i]), puts(  );   }   int main() {     run();     return 0;   }   