1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
   | #include<bits/stdc++.h> #define int long long #define LL __int128 #define ull unsigned long long #define maxn 600005 #define put() putchar('\n') #define Tp template<typename T> #define Ts template<typename T,typename... Ar> using namespace std; Tp void read(T &x){     int f=1;x=0;char c=getchar();     while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}     while (c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}     x*=f; } #define fi first #define se second #define mk make_pair namespace Debug{ 	Tp void _debug(char* f,T t){cerr<<f<<'='<<t<<endl;} 	Ts void _debug(char* f,T x,Ar... y){while(*f!=',') cerr<<*f++;cerr<<'='<<x<<",";_debug(f+1,y...);} 	#define gdb(...) _debug((char*)#__VA_ARGS__,__VA_ARGS__) }using namespace Debug; void print(LL ans) { 	if (ans>=10) print(ans/10); 	putchar(ans%10+'0'); } int n; int nex[maxn],s[maxn],w[maxn]; const int inf=1e15; const LL MASK=(1<<30)-1; int stac[maxn],tot,fa[maxn][27]; int query(int x) { 	return w[*lower_bound(stac+1,stac+1+tot,x)]; } int Min; LL ans,sum; map<int,int>mp; void add(int x,int y) { 	mp[x]+=y; 	sum+=x*y; } signed main(void){ 	int i,id=0,j,now;char ch; 	read(n); 	cin>>ch>>w[1];ans=w[1];s[1]=ch-'a'+1;Min=w[1]; 	print(ans);put(); 	stac[tot=1]=1; 	for (i=2;i<=n;i++) { 		ch=getchar();while (ch<'a'||ch>'z') ch=getchar();read(w[i]); 		ch= 'a'+(ch-'a'+ans)%26; 		w[i]=w[i]^(ans&MASK); 		s[i]=ch-'a'+1; 		while (id&&s[i]!=s[id+1]) id=nex[id]; 		if (s[i]==s[id+1]) id++; 		nex[i]=id; 		for (j=1;j<=26;j++) fa[i][j]=fa[nex[i]][j]; 		fa[i][s[nex[i]+1]]=nex[i]; 		 		for (j=1;j<=26;j++) { 			if (j==s[i]) continue; 			for (now=fa[i-1][j];now;now=fa[now][j]) { 				add(query(i-now),-1); 			}  		} 		while (tot&&w[stac[tot]]>w[i]) tot--; 		stac[++tot]=i;  		 		if (s[1]==s[i]) add(w[i],1); 		while (mp.begin()!=mp.end()&&(*--mp.end()).fi>w[i]) { 			auto it=--mp.end(); 			auto tmp=*it; 			add(w[i],tmp.se); 			add(tmp.fi,-tmp.se); 			mp.erase(it); 		}  		Min=min(Min,w[i]); 		ans+=Min+sum; 		print(ans);put();  	}     return 0; }
   |