日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

P4036-[JSOI2008]火星人【Splay,二分,hash】

發布時間:2023/12/3 javascript 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P4036-[JSOI2008]火星人【Splay,二分,hash】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P4036


題目大意

一個字符串要求支持

  • 插入一個字符
  • 修改一個字符
  • 詢問兩個后綴的最長公共前綴。

  • 解題思路

    如果不考慮修改我們可以用二分+hash+hash+hash解決該問題,但是涉及到修改和插入我們考慮用SplaySplaySplay維護hashhashhash值。

    合并時使用hash=hashl?psizr+1+val?psizr+hashrhash=hash_l*p^{siz_r+1}+val*p^{siz_r}+hash_rhash=hashl??psizr?+1+val?psizr?+hashr?進行合并即可。


    codecodecode

    #include<cstdio> #include<cstring> #include<algorithm> #define ull unsigned long long using namespace std; const int N=2e5+10; const ull base=131; struct node{int siz;ull val,hash; }a[N]; int n,root,tot,m; int t[N][2],fa[N]; char s[N]; ull p[N]; bool Direct(int x) {return t[fa[x]][1]==x;} void Merge(int x){a[x].siz=a[t[x][0]].siz+a[t[x][1]].siz+1;a[x].hash=p[a[t[x][1]].siz+1]*a[t[x][0]].hash+p[a[t[x][1]].siz]*a[x].val+a[t[x][1]].hash; } void Connect(int x,int y,int dir) {t[x][dir]=y;fa[y]=x;} void Rotate(int x){int y=fa[x],root=fa[fa[x]];int ys=Direct(x),rs=Direct(y);int z=t[x][ys^1];Connect(y,z,ys);Connect(x,y,ys^1);Connect(root,x,rs);Merge(y);Merge(x);return; } void Splay(int x,int f) {while(fa[x]!=f){int up=fa[x];if(fa[up]==f) Rotate(x);else if(Direct(x)==Direct(up))Rotate(up),Rotate(x);else Rotate(x),Rotate(x); }return; } int Find(int x,int k) {if(a[t[x][0]].siz>=k) return Find(t[x][0],k);if(a[t[x][0]].siz+1==k) return x;return Find(t[x][1],k-a[t[x][0]].siz-1); } int Split(int l,int r) {int x=Find(root,l),y=Find(root,r+2);Splay(x,0);Splay(y,x);root=x;return t[y][0]; } ull ValSeq(int x,int y) {return a[Split(x,y)].hash; } int main() {scanf("%s",s+1);n=strlen(s+1);a[1].siz=p[0]=1;for(int i=1;i<N;i++)p[i]=p[i-1]*base;for(int i=1;i<=n;i++){a[i+1].val=s[i]-'a'+1;fa[i]=i+1;t[i+1][0]=i;Merge(i+1);}fa[n+1]=n+2;t[n+2][0]=n+1;Merge(n+2);root=tot=n+2;scanf("%d",&m);while(m--){char op[2];scanf("%s",op);if(op[0]=='Q'){int x,y;scanf("%d%d",&x,&y);int l=0,r=min(n-x,n-y);while(l<=r){int mid=(l+r)/2;if(ValSeq(x,x+mid)==ValSeq(y,y+mid)) l=mid+1;else r=mid-1;}printf("%d\n",r+1);}if(op[0]=='R'){int x;char c[2];scanf("%d%s",&x,c);int k=Split(x,x);a[k].val=a[k].hash=c[0]-'a'+1;Splay(k,0);root=k;}if(op[0]=='I'){int x;char c[2];scanf("%d%s",&x,c);x++;int l=Find(root,x),r=Find(root,x+1);Splay(l,0);Splay(r,l);n++;fa[++tot]=r;t[r][0]=tot;a[tot].siz=1;a[tot].val=a[tot].hash=c[0]-'a'+1;Splay(tot,0);root=tot;}} }

    總結

    以上是生活随笔為你收集整理的P4036-[JSOI2008]火星人【Splay,二分,hash】的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 怡红院最新网址 | 日日爱影视 | 91九色porn| 伊人一级| 禁漫天堂下载18 | 欧美福利电影 | 成人福利视频在线 | 欧美在线视频免费 | 久久精彩免费视频 | 少妇免费直播 | 中文字幕高清在线免费播放 | 97色伦97色伦国产欧美空 | 欧美一区二区免费视频 | 国产男女猛烈无遮挡免费视频 | 青青青国产在线 | 日本吃奶摸下激烈网站动漫 | 国产一区麻豆 | 98久久久| 久久激情五月 | 国产精品伦理一区 | 国产在线精品成人欧美 | 国产一区二区色 | 99热超碰| av在线播放一区二区三区 | 亚洲一区天堂 | 操bbbbb| 国产免费一区二区 | 久久国产经典 | 欧美日韩中文字幕在线播放 | 天天插天天摸 | 欧美绿帽交换xxx | 日本大尺度做爰呻吟 | 国产a级免费 | 极品销魂美女少妇尤物 | 中文字幕一区二区三区在线不卡 | 亚洲va在线∨a天堂va欧美va | 日韩大片免费 | 姐姐你真棒插曲快来救救我电影 | 韩国三级在线 | 黄色成人av网站 | 五月天婷婷丁香 | 免费视频久久久 | 精品国产91乱码一区二区三区 | 成人毛片在线免费观看 | 中文字幕在线一区二区三区 | 在线免费观看网站入口在哪 | 亚洲第七页 | 依人久久| 老色批网站 | 日日夜夜中文字幕 | 成 年 人 黄 色 大 片大 全 | 伊人网亚洲 | 日本美女动态图 | 欧美 日韩 国产 在线观看 | 日本在线www | 日韩精品免费一区二区三区 | 日韩一级黄 | 一区二区美女视频 | 午夜视频久久 | 黄色一级免费大片 | 国产99在线观看 | 五月婷婷激情网 | 免费日韩欧美 | 中文字幕一区视频 | 美女赤身免费网站 | 91av在线看 | 亚洲激情在线 | 一区亚洲 | 四虎影院新网址 | 夜夜爱av | 东北老女人av | 亚洲视频91 | 99精品在线观看视频 | 久久久久中文字幕亚洲精品 | 伊人av网站| 欧美草比视频 | 日本猛少妇色xxxxx猛叫 | 波多野结衣二区 | 欧美vieox另类极品 | 人妻饥渴偷公乱中文字幕 | 日本美女逼 | 国产精品国产精品 | 中文字幕在线观看 | 午夜性激情 | 欧美性插插 | 正在播放木下凛凛xv99 | 久久精品国产一区二区 | 日韩欧美一级二级 | 91精品国产综合久久久久久 | 91精品一区二区三区综合在线爱 | 国产网站无遮挡 | 瑟瑟视频在线看 | 在厨房拨开内裤进入毛片 | 久久久黄色| ww黄色 | 亚洲国产欧美精品 | 欧美交换国产一区内射 | 强伦人妻一区二区三区视频18 | 中文字幕天堂av |