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

歡迎訪問 生活随笔!

生活随笔

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

javascript

[JSOI2008 Prefix火星人]

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

[關鍵字]:splay hash 二分

[題目大意]:給出一個字符串,求出給定的兩個后綴的的最長公共前綴。在求的過程中會有改變或在某個位置添加字符的操作。

//============================================================================================

[分析]:一聽最長公共前綴馬上想到后綴數組,但因為是動態維護所以后綴數組也無能為力??梢园炎址胂蟪梢粋€數組,于是變成了動態插入和改變一個序列,還要能快速找到兩個子區間——splay。求最長公共前綴可以用二分答案加驗證的方法,二分長度先提取出這個區間然后判斷這個區間的根節點的hash值(實際就是這棵子樹的hash)是否和另一個相同。hash值得判斷可以用進制法:hash=ord(s[1])*270+ord(s[2])*271+……+ord(s[n])*27n-1,在旋轉時更新hash值為:hash[lc]+s[v]*27^(size[lc]+1)+hash[rc]*27^(size[lc]+2)。插入操作和一般splay插入無異修改只要修改掉這個點的值和hash值就行了。

[代碼]:

View Code #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std;const int MAXL=100015; const int MOD=9875321;struct node {node *c[2],*f;int dat,size,hash; }*root,SC[MAXL],*null; char s[MAXL]; int m,SS; int d[MAXL];void Debug(node *v) {if (v==null) return;Debug(v->c[0]);printf("%d ",v->dat);Debug(v->c[1]); }node *New(int d,int h,node *fa) {node *e=SC+ ++SS;e->size=1,e->f=fa;e->c[1]=e->c[0]=null;e->dat=d,e->hash=h;return e; }void Update(node *v) {if (v==null) return;v->size=v->c[0]->size+v->c[1]->size+1;v->hash=(long long)(v->c[0]->hash+(long long)v->dat*d[(v->c[0]->size+1)]+(long long)v->c[1]->hash*d[(v->c[0]->size+2)])%MOD; }void Prepare() {SS=-1;null=NULL;null=New(0,0,NULL);null->size=0;root=New(0,0,null);root->c[1]=New(0,0,root);d[1]=1;for (int i=2;i<=100010;++i)d[i]=(d[i-1]*27)%MOD;Update(root); }void Rotate(node *x,int o) {node *y=x->f;y->c[o]=x->c[!o];y->c[o]->f=y;x->f=y->f;if (y->f->c[0]==y)y->f->c[0]=x;elsey->f->c[1]=x;x->c[!o]=y;y->f=x;if (y==root) root=x;Update(y); }void Splay(node *x,node *fa) {while (x->f!=fa)if (x->f->f==fa)if (x->f->c[0]==x)Rotate(x,0);elseRotate(x,1);elseif (x->f->f->c[0]==x->f)if (x->f->c[0]==x)Rotate(x->f,0),Rotate(x,0);elseRotate(x,1),Rotate(x,0);else if (x->f->c[1]==x)Rotate(x->f,1),Rotate(x,1);elseRotate(x,0),Rotate(x,1);Update(x); }void Select(int k,node *fa) {node *t=root;while (1){if (k==t->c[0]->size+1) break;if (k<t->c[0]->size+1) t=t->c[0];if (k>t->c[0]->size+1) k-=t->c[0]->size+1,t=t->c[1];}Splay(t,fa); }int Hash(int x,int y) {Select(x,null),Select(y+2,root);return root->c[1]->c[0]->hash; }void Ask(int x,int y) {int ans=0,n=root->size-2;for (int i=1<<18;i;i>>=1)if (x+i-1<=n && y+i-1<=n && Hash(x,x+i-1)==Hash(y,y+i-1))ans+=i,x+=i,y+=i;printf("%d\n",ans); }void Ins(int x,char ch) {Select(x+1,null),Select(x+2,root);root->c[1]->c[0]=New(ch-'a',ch-'a',root->c[1]);Splay(root->c[1]->c[0],null);//Debug(root),printf("\n"); }void Rep(int x,char ch) {Select(x,null),Select(x+2,root);node *v=root->c[1]->c[0];v->dat=ch-'a';v->hash=(long long)(v->c[0]->hash+(long long)v->dat*d[(v->c[0]->size+1)]+(long long)v->c[1]->hash*d[(v->c[0]->size+2)])%MOD;//Debug(root),printf("\n"); }void Init() {node *z,*t;Prepare();scanf("%s",s);int n=strlen(s);z=t=New(s[0]-'a',s[0]-'a',null);for (int i=1;i<n;++i)z=z->c[1]=New(s[i]-'a',s[i]-'a',z);root->c[1]->c[0]=t,t->f=root->c[1];Splay(z,null);//Debug(root),printf("\n"); }void Solve() {char ch; int x,y;scanf("%d",&m),scanf("%c",&ch);for (int i=1;i<=m;++i){scanf("%c",&ch);if (ch=='Q') scanf("%d %d",&x,&y),Ask(x,y); elseif (ch=='I') scanf("%d %c",&x,&ch),Ins(x,ch); elsescanf("%d %c",&x,&ch),Rep(x,ch);scanf("%c",&ch);} }int main() {freopen("in","r",stdin);freopen("out","w",stdout);Init();Solve();return 0; }

轉載于:https://www.cnblogs.com/procedure2012/archive/2012/04/13/2445062.html

總結

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

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

主站蜘蛛池模板: 人妻精油按摩bd高清中文字幕 | 国产一区影院 | 久久视频精品在线 | a级片免费观看 | 亚洲一区在线免费观看 | 色婷婷伊人 | 亚洲 欧美 日韩 国产综合 在线 | 精品人妻伦九区久久aaa片 | 日本美女黄色 | 啪啪日韩 | 手机看黄色| 欧美激情综合色综合啪啪五月 | 日韩精品在线免费观看视频 | 熟妇一区二区三区 | 环太平洋3:泰坦崛起 | 蜜乳av懂色av粉嫩av | 日韩人妻无码精品综合区 | 国语av | 瑟瑟视频网站 | 加勒比一区在线 | 国产资源在线免费观看 | 欧美 日韩 成人 | 久久国产在线视频 | 亚洲啪| 吻胸摸激情床激烈视频大胸 | 小柔的淫辱日记(h | 国产三级在线免费观看 | 欧美成人777 | 鲁一鲁一鲁一鲁一av | 亚洲色图欧美自拍 | 免费黄色链接 | 国产日韩欧美成人 | 成人h动漫精品一区二区无码 | 欧美性大战久久久久久久 | 日韩成人在线视频观看 | 国精产品一区二区三区 | 国产成人免费观看视频 | 日韩亚洲欧美一区二区三区 | 草色噜噜噜av在线观看香蕉 | 美女扒开大腿让男人桶 | 一区三区在线 | 国产又色又爽无遮挡免费动态图 | 91精品综合久久久久久五月天 | 欧美一级黄色片在线观看 | 欧美黑人孕妇孕交 | 欧美精品一区二区三区久久久 | 国产精品久久久久久久久久免费看 | 中文字幕久久av | 亚洲AV成人午夜无码精品久久 | 午夜三级在线观看 | 蜜臀视频网站 | 欧美一区在线看 | 欧美激情一区二区视频 | 三级黄色小视频 | 中国黄色网页 | 在线视频播放大全 | 9999视频 | 久久精工是国产品牌吗 | 日日骚一区二区 | 成人做爰www免费看视频网站 | 青青草自拍视频 | 在线观看日韩av电影 | 五十路六十路七十路熟婆 | 国产www | 中文字幕亚洲欧美日韩在线不卡 | 成人久久免费 | 天天综合天天做 | 制服丝袜av一区二区三区下载 | bt天堂av| 精品久久网站 | 欧美乱插 | 亚洲熟女乱色一区二区三区 | 免费久草视频 | 国产一级二级视频 | 国产一线天粉嫩馒头极品av | 精品乱码久久久久久中文字幕 | 国产午夜成人久久无码一区二区 | 国产精品天美传媒入口 | 邻居少妇张开腿让我爽了在线观看 | 国产喷白浆一区二区三区 | 亚洲国内自拍 | 91嫩草精品 | 国产成人在线观看免费 | 欧美综合网 | 四虎网站在线播放 | 欧美黄色性生活 | 国产精品久久久久99 | 久久a级片 | 日本一区二区三区视频免费看 | www.com欧美| 最新三级网站 | 日本伦理片在线看 | 久久人人看 | 91亚洲精品久久久蜜桃网站 | 亚洲视频自拍偷拍 | 丁香一区二区 | 一级片视频在线观看 | 懂色a v| 天堂网ww|