CF1286E 题解
思路
维护当前 border 集合和答案。从
考虑删除那些。
对于合法的那些,新加入
爆 long long,维护
code
int n,a[maxn];
int nxt[maxn],to[maxn][26];
ll ans1,ans2,ans26,ansmod;
char s[maxn];
int st[20][maxn];
void add(int p){
st[0][p]=a[p];
for(int i=1;(1<<i)<=p;i++)st[i][p]=min(st[i-1][p],st[i-1][p-(1<<i-1)]);
}
int que(int l,int r){
int k=log2(r-l+1);
return min(st[k][r],st[k][l+(1<<k)-1]);
}
void inc(ll x){
(ans26+=x)%=26,(ansmod+=x)&=((1<<30)-1);
ans2+=x;ans1+=ans2/inf,ans2%=inf;
}
inline void write(__int128 x){static char buf[40];static int len=-1;if(x<0)putchar('-'),x=-x;do buf[++len]=x%10,x/=10;while(x);while(len>=0)putchar(buf[len--]+48);}
void prinf(){
if(!ans1)printf("%lld\n",ans2);
else{
__int128 val=(__int128)ans1*inf+ans2;
write(val);puts("");
}
}
ll res;
map<int,int> mp;
void ins(int u,int v){mp[u]+=v,res+=1ll*u*v;}
void mn(int x){
auto it=mp.upper_bound(x);int num=0;
while(it!=mp.end()){
num+=(*it).second;res-=1ll*(*it).first*(*it).second;
it=mp.erase(it);
}
ins(x,num);
}
void work(){
n=read();
for(int i=1,j=0;i<=n;i++){
cin>>s[i];s[i]=(s[i]-'a'+ans26)%26+'a';
a[i]=read()^ansmod;
add(i);inc(que(1,i));
if(i==1){prinf();continue;}
while(j&&s[i]!=s[j+1])j=nxt[j];
if(s[i]==s[j+1])j++;
nxt[i]=j;
if(s[1]==s[i])ins(a[i],1);
for(int k=0;k<26;k++)to[i][k]=to[nxt[i]][k];
to[i][s[nxt[i]+1]-'a']=nxt[i];
for(int k=0;k<26;k++)if(s[i]-'a'!=k){
int x=to[i-1][k];
while(x){
ins(que(i-1-x+1,i-1),-1);
x=to[x][k];
}
}
mn(a[i]);inc(res);prinf();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】