WA on #5 求调
查看原帖
WA on #5 求调
1025380
Fire_Shadow_Dream楼主2025/1/24 00:59
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+90,M=(1<<30)-1;
ll n,fail[N],w[N],ans,ansn;
char c[N];
ll f[N][20],dif[N];
void add(int p){
	f[p][0]=w[p];
	for(int i=1;(1<<i)<=p;i++) f[p][i]=min(f[p][i-1],f[p-(1<<i-1)][i-1]);
}
ll qmin(ll l,ll r){
	ll k=log2(r-l+1);
	return min(f[r][k],f[l+(1<<k)-1][k]);
}
map<ll,ll>mp; 
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	int j=0;
	memset(f,127,sizeof f);
	for(int i=1;i<=n;i++){
		cin>>c[i]>>w[i];
		c[i]=char((c[i]-'a'+ans)%26+'a');
		w[i]^=(ans&M);
		add(i);
		ll kp=qmin(1,i);
		ans+=kp;
//		mp[kp]++;
		if(i==1){
//			ansn+=kp;
			cout<<ans<<"\n";
			continue;
		}
		while(j&&c[j+1]!=c[i]) j=fail[j];
		if(c[j+1]==c[i]) j++;
		fail[i]=j;
		if(c[i]==c[fail[i-1]+1]) dif[i-1]=dif[fail[i-1]];
		else dif[i-1]=fail[i-1];
		int p=dif[i-1];
		while(p){
			ll sum=qmin(i-p,i-1);
			ansn-=sum;
			mp[sum]--;
			if(!mp[sum]) mp.erase(sum);
			p=dif[p];
		} 	
		if(c[1]==c[i]) ansn+=w[i],mp[w[i]]++;
		map<ll,ll>::iterator it,pl;
		int ps=0;
		bool fl=1;
		for(it=mp.upper_bound(w[i]);it!=mp.end();it++){
			if(!fl) mp.erase(pl);
			ansn-=(ll)(it->first-w[i])*it->second;
			ps+=it->second;
			pl=it;
			fl=0;
		} 
		if(!fl) mp.erase(pl);
		mp[w[i]]+=ps;
		ans+=ansn;
		cout<<ans<<"\n";
	}
	return 0;
}
/*
a b a b
0 0 1 2
*/
2025/1/24 00:59
加载中...