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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[bzoj4566][HAOI2016]找相同字符(后缀数组)

發布時間:2024/1/18 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [bzoj4566][HAOI2016]找相同字符(后缀数组) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目

傳送門

題解

這里:把兩個串用一個很大的字符連接起來,求一個后綴數組。
考慮怎樣暴力的算答案。
rank? r a n k 數組中從前往后枚舉起點,對于每個枚舉的起點,都暴力的往后掃,掃的過程中維護一個 height? h e i g h t 的最小值。每到一個點的時候,如果這個點跟起點不屬于一個串,就將答案加上當前的最小值,這樣是O(n2)的考慮這個還能怎么算。可以發現我們是維護 height? h e i g h t 的最小值。那么我們可以按照 height? h e i g h t 從大到小的順序掃,這樣每次需要用的就是當前的 height? h e i g h t
掃的過程中用并查集維護一下每個串分別對哪些串有貢獻的(也就是 height? h e i g h t 數組的貢獻)。
用乘法原理算一下當前的 height? h e i g h t 會有多少貢獻。就是用當前的 height? h e i g h t 乘上這個串和上一個串分別對于兩個兩個不同的原串的乘積的和。

代碼

#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define ll long long const int maxn=1e6; const int inf=1e9;int n,len1,m=200,x[maxn],y[maxn],c[maxn],sa[maxn],rnk[maxn],height[maxn],fa[maxn],id[maxn]; int st[maxn],ed[maxn]; char s[maxn],ch[maxn]; ll ans;void build_sa() {for (int i=0; i<m; i++) c[i]=0;for (int i=0; i<n; i++) c[x[i]=s[i]]++;for (int i=1; i<m; i++) c[i]+=c[i-1];for (int i=n-1; i>=0; i--) sa[--c[x[i]]]=i;for (int k=1; k<=n; k<<=1){int p=0;for (int i=n-k; i<n; i++) y[p++]=i;for (int i=0; i<n; i++) if (sa[i]>=k) y[p++]=sa[i]-k;for (int i=0; i<m; i++) c[i]=0;for (int i=0; i<n; i++) c[x[i]]++;for (int i=1; i<m; i++) c[i]+=c[i-1];for (int i=n-1; i>=0; i--) sa[--c[x[y[i]]]]=y[i];swap(x,y);p=1; x[sa[0]]=0;for (int i=0; i<n; i++)x[sa[i]] = y[sa[i-1]]==y[sa[i]] && ((sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])) ?p-1:p++;if (p>n) break;m=p;} }void build_height() {int k=0;for (int i=0; i<n; i++) rnk[sa[i]]=i;for (int i=0; i<n; i++){if (!rnk[i]) continue;if (k) k--;int j=sa[rnk[i]-1];while (i+k<n && j+k<n && s[i+k]==s[j+k]) k++;height[rnk[i]]=k;} }bool cmp(int x,int y) {return height[x]>height[y];} int find(int x) {if (fa[x]!=x) return fa[x]=find(fa[x]);return fa[x]; } void work(int x) {int xx=find(x); int yy=find(x-1);ans+=(ll)(st[xx]*ed[yy]+st[yy]*ed[xx])* (ll)height[x]; // printf("r1 %d r2 %d :(%d*%d + %d*%d) * %d\n",xx,yy,st[xx],ed[yy],st[yy],ed[xx],height[x]);st[xx]+=st[yy];ed[xx]+=ed[yy]; // printf("%d %d\nans:%d\n",st[xx],ed[xx],ans);fa[yy]=xx; }int main() {scanf("%s%s",s,ch);len1=strlen(s); n=len1+strlen(ch); n++;s[len1]='#';for (int i=0; i<strlen(ch); i++)s[len1+1+i]=ch[i];build_sa();build_height();for (int i=0; i<n; i++) id[i]=i;for (int i=0; i<n; i++) fa[i]=i;for (int i=0; i<n; i++){st[i]=sa[i]<len1;ed[i]=st[i]^1;}sort(id,id+n,cmp);for (int i=0; i<n; i++) work(id[i]);printf("%lld",ans);return 0; }

總結

以上是生活随笔為你收集整理的[bzoj4566][HAOI2016]找相同字符(后缀数组)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 女人叉开腿让男人桶 | 综合久久精品 | 国模大胆一区二区三区 | 火影忍者羞羞漫画 | 欧美男女激情 | 国模小丫大尺度啪啪人体 | 在线播放亚洲 | av不卡一区 | 肉丝袜脚交视频一区二区 | 一区二区不卡视频在线观看 | 成人在线h| 午夜私人影院 | 中文字幕在线2021 | 日本黄色三级网站 | 久久裸体视频 | 91网页版| 视频二区在线观看 | 激情777| 亚洲精品视频免费 | 暴操白虎 | 狠狠干网 | 日日摸日日添日日碰9学生露脸 | 1000部国产精品成人观看 | 综合国产一区 | 黄色香港三级三级三级 | √资源天堂中文在线视频 | 亚洲精品久久久久av无码 | 国产激情网站 | 超碰av在线| 国产三级91 | 800av凹凸 | 久久大香焦 | 色噜噜狠狠一区二区三区牛牛影视 | 免费在线看污片 | 亚洲一区二区在线播放 | 婷婷色在线播放 | 日韩精品免费观看 | 久久影院中文字幕 | 国产一区不卡在线 | 成人免费大片黄在线播放 | 久久国产精品系列 | 黄色网址多少 | www.欧美色| 森泽佳奈中文字幕 | 午夜视频www | 蜜桃91丨九色丨蝌蚪91桃色 | free性欧美69巨大 | 亚洲一区二区美女 | 韩日三级视频 | 青青草.com| 最新超碰 | 欧美色图在线播放 | 成人精品视频网站 | 久久观看最新视频 | 国产精品刘玥久久一区 | 影音先锋欧美资源 | 亚洲免费视频一区 | 国内露脸中年夫妇交换 | 99久久久国产精品免费蜜臀 | 黄色日批网站 | 夜夜操网站 | 日日夜夜操av | 91人人看| 亚洲一区二区三区四区五区六区 | 韩日三级视频 | 色噜噜狠狠成人中文 | 爱av导航 | 欧美操操操 | www在线观看视频 | 黄色片免费看 | 黄色综合网站 | 一级肉体全黄裸片 | 亚洲欧美综合视频 | 欧美综合自拍亚洲综合图片区 | 绿帽人妻精品一区二区 | 国产精品久久国产精品99 | 黄色网页观看 | 91丨porny丨海角社区 | 性色av无码久久一区二区三区 | 亚洲天堂福利视频 | 性猛交ⅹxxx富婆视频 | 香蕉a视频 | 免费在线性爱视频 | 精品一区二区在线播放 | 麻豆偷拍 | 中文字幕――色哟哟 | 日韩精品久久久久久久电影99爱 | 精品影片一区二区入口 | 影音先锋男人资源网站 | 李丽珍裸体午夜理伦片 | 国产免费观看av | 日本理论中文字幕 | 欧美福利一区二区 | 日本肉体xxxx裸体137大胆图 | 欧美性视频网站 | av亚州| 一级二级三级黄色片 | 白嫩日本少妇做爰 | 国内久久久 |