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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2019ICPC(徐州) - Colorful String(哈希+二分+动态规划/回文自动机)

發(fā)布時間:2024/4/11 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2019ICPC(徐州) - Colorful String(哈希+二分+动态规划/回文自动机) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接:點擊查看

題目大意:給出一個字符串,詢問該字符串中的所有回文子串中,各有多少不同的字母

題目分析:這個題題意很簡單,在比賽的時候看到字符串第一反應是哈希,哈希+暴力+線段樹果不其然的T掉了。。還超了一秒鐘,完完全全的是算法的問題,所以就沒再碰那個題了,賽后對這個題一直很在意,磨了一個星期,可算是磨出來了,期間的過程也是艱難險阻嗷,這個題目的正解是用回文自動機來做(好像一切有關于回文串的問題都能用這個來做,太強了),于是就想去偷學一波,因為需要前置知識是關于fail指針的理解,就先花了兩天肝會了KMP,然后又去看回文自動機了,看了兩天還是不太懂fail邊是怎么建的,只會用模板,但不太會用,隨后去網(wǎng)上看有沒有別的方法,還有一個馬拉車的,還有一個就是哈希+二分判斷回文串的,學了一手,就可以用logn的時間來判斷每個點為中點的最長回文串了,再配合上動態(tài)規(guī)劃記錄一下每個字母上一次出現(xiàn)的位置,就可以以O(26)的時間復雜度查詢一段區(qū)間內每個字母出現(xiàn)過的次數(shù)了,這一塊我也不太懂,是交給隊友研究的,最后一組合起來,二分+哈希+動態(tài)規(guī)劃,總時間復雜度是n*logn*26,完美解決了這個問題

等以后學會了回文自動機在來回顧一下這個題吧。。現(xiàn)在還是太菜了


2020.2.6更新:

刷字符串剛好想起來還有這樣一道題,回來看了一眼題意,回文自動機模板粘貼,稍微修改一下內部實現(xiàn),10分鐘不到一氣呵成完成AC,回首看看半年前的自己是真的弱,當時徐州這場比賽我們隊出了三個題目,在學校里的rank是倒數(shù)第一。。不多說了,今年加油吧

回文自動機來解這個題的話,只需要在每個節(jié)點再維護一下顏色的個數(shù)就好了,我選擇的是用狀態(tài)壓縮,因為一共才26個字母,一個int整數(shù)就可以保存,題目問的是每個回文子串的貢獻,所以我們還需要維護一下每個節(jié)點所出現(xiàn)的次數(shù),最后O(n)遍歷一遍每個節(jié)點維護答案就好了

上代碼:

哈希+二分+動態(tài)規(guī)劃:

#include<iostream> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=3e5+100;ull hash1[N],hash2[N],p[N];string str;int n;void HASH() {hash1[0]=0;hash2[n+1]=0;for(int i=1;i<=n;i++)hash1[i]=hash1[i-1]*131+str[i]-'a'+1;for(int i=n;i>=1;i--)hash2[i]=hash2[i+1]*131+str[i]-'a'+1;p[0]=1;for(int i=1;i<=n;i++)p[i]=p[i-1]*131; } int pos[N][30];bool check(int i,int len,bool sta)sta=1:奇數(shù)回文串 sta=0:偶數(shù)回文串 {int l,r;if(sta){l=i-len;r=i+len;}else{l=i-len;r=i+len+1;}if(l<=0||r>n)return false;ull a=hash1[r]-hash1[l-1]*p[r-l+1];ull b=hash2[l]-hash2[r+1]*p[r-l+1];return a==b; }LL getval(int l,int r)//獲得區(qū)間內有多少不同的字母 {LL ans=0;for(int i=0;i<26;i++){LL temp=pos[r][i]-l+1;if(temp<0)continue;ans+=temp;}return ans; }int main() { // freopen("input.txt","r",stdin);while(cin>>str){n=str.size();str=" "+str;HASH(); for(int i=0;i<26;i++)pos[0][i]=-1;for(int i=1;i<=n;i++)//dp存每個字母前一次出現(xiàn)的位置 {for(int j=0;j<26;j++)pos[i][j]=pos[i-1][j];pos[i][str[i]-'a']=i;}LL ans=0;for(int i=1;i<=n;i++)//統(tǒng)計所有奇數(shù)回文串{int l=0;int r=n;int len;while(l<=r){int mid=l+r>>1;if(check(i,mid,1)){len=mid;l=mid+1;}else{r=mid-1;}}int x=i-len;int y=i;ans+=getval(x,y);}for(int i=1;i<n;i++)//統(tǒng)計所有偶數(shù)回文串{int l=0;int r=n;int len=-1;while(l<=r){int mid=l+r>>1;if(check(i,mid,0)){len=mid;l=mid+1;}else{r=mid-1;}}if(len==-1)continue;int x=i-len;int y=i;ans+=getval(x,y);}printf("%lld\n",ans);}return 0; }

回文自動機:

#include<iostream> #include<cstdio> #include<string> #include<ctime> #include<cmath> #include<cstring> #include<algorithm> #include<stack> #include<climits> #include<queue> #include<map> #include<set> #include<sstream> using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=3e5+100;char s[N];int n;struct Palindrome_tree {int nxt[N][26];int fail[N]; // 當前節(jié)點最長回文后綴的節(jié)點int len[N]; // 當前節(jié)點表示的回文串的長度int cnt[N]; // 當前節(jié)點回文串的個數(shù), 在getcnt后可得到全部int sed[N]; // 以當前節(jié)點為后綴的回文串的個數(shù)(并不是表示第i結尾的回文串的種類數(shù),如果要求每個點結尾的數(shù)的回文串個數(shù),得用last)int record[N]; //record記錄了節(jié)點回文串的結束位置int color[N];//顏色 char s[N];int tot; // 節(jié)點個數(shù)int last; // 上一個節(jié)點int n;//當前字符串的長度 void init(){tot = n = 0;memset(fail, 0, sizeof fail);memset(cnt, 0, sizeof cnt);memset(sed, 0, sizeof sed);memset(len, 0, sizeof len);memset(nxt, 0, sizeof nxt);}void build(){len[0] = 0, len[1] = -1; // 0為偶數(shù)長度根, 1為奇數(shù)長度根tot = 1, last = 0;fail[0] = 1;}int getfail(int x, int n){while (s[n - len[x] - 1] != s[n]||n-len[x]-1<0) // 比較x節(jié)點回文串新建兩端是否相等//n-len[x]-1<0這個是我自己加的,多組的時候光第一個條件是不夠的,所以有錯請手動刪除x = fail[x]; // 若不同, 再比較x后綴回文串兩端return x;}void insert(char ch){int c = ch - 'a';//全小寫要用a 全大寫要用A 不然會錯s[++n]=ch;int p = getfail(last, n);// 得到第i個字符可以加到哪個節(jié)點的兩端形成回文串if (!nxt[p][c]){tot++;len[tot] = len[p] + 2; // 在p節(jié)點兩端添加兩個字符color[tot]=color[p]|(1<<c);fail[tot] = nxt[getfail(fail[p], n)][c]; //tot點的后綴回文,可以由上一個節(jié)點的后綴回文嘗試得到sed[tot] = sed[fail[tot]] + 1; // 以當前節(jié)點為結尾的回文串個數(shù)nxt[p][c] = tot; // 新建節(jié)點}last = nxt[p][c]; // 當前節(jié)點成為上一個節(jié)點cnt[last]++; //當前節(jié)點回文串++record[last] = n;}void get_cnt(){for (int i = tot; i > 0; i--)cnt[fail[i]] += cnt[i];//fail[i] 的節(jié)點 為 i 節(jié)點的后綴回文串, 所以個數(shù)相加} }tree;int get_num(int num) {int cnt=0;while(num){if(num&1)cnt++;num>>=1;}return cnt; }int main() { //#ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); //#endif // ios::sync_with_stdio(false);scanf("%s",s);n=strlen(s);tree.init();tree.build();for(int i=0;i<n;i++)tree.insert(s[i]);tree.get_cnt();LL ans=0;for(int i=1;i<=tree.tot;i++)ans+=tree.cnt[i]*get_num(tree.color[i]);printf("%lld\n",ans);return 0; }

?

總結

以上是生活随笔為你收集整理的2019ICPC(徐州) - Colorful String(哈希+二分+动态规划/回文自动机)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 五月婷婷开心网 | 草草草在线视频 | 男女国产精品 | 成人黄色录像 | 精品视频一区二区三区在线观看 | 中文字幕第35页 | 成人黄色录像 | 国产精品久久久久久久裸模 | 久久艹这里只有精品 | 欧美视频直播网站 | 一区二区三区黄色录像 | 亚洲欧美制服丝袜 | 毛片精品 | 国产偷人妻精品一区二区在线 | 欧美经典一区二区 | www.超碰在线观看 | 综合人人| 丝袜国产视频 | 性高潮久久久久久久久 | 久久九九热视频 | 国产高清片 | 国产日产欧洲无码视频 | 视频一区二区不卡 | 极品美女被c | 国产女教师bbwbbwbbw | 午夜视频福利在线 | 性猛交ⅹxxx富婆视频 | 两性午夜免费视频 | 久久免费片 | 懂色av一区二区三区蜜臀 | 久久久久久成人精品 | 落日余晖 | 少妇裸体淫交视频免费看高清 | 中文有码av | 神马久久久久久久 | 国内av片 | 天天爽天天爱 | 国产正在播放 | 私密视频在线观看 | 日韩av电影中文字幕 | 波多野结衣在线视频免费观看 | 色吧综合网 | 亚洲最大成人综合网 | 后宫秀女调教(高h,np) | 欧美久久久久久久久中文字幕 | 献给魔王伊伏洛基亚吧动漫在线观看 | 成人在线免费电影 | 第四色视频 | av在线黄 | 野外做受又硬又粗又大视频√ | 日日夜夜人人 | 亚洲片在线观看 | 国产精品久久久久久久免费观看 | 韩国特级毛片 | 综合成人 | √天堂资源在线 | 色戒av| 亚洲黄色精品视频 | 国产福利在线免费观看 | 91蜜桃臀久久一区二区 | 插插插操操操 | 亚洲九九色 | 欧美黄色三级视频 | 麻豆视频在线免费看 | 一级小毛片 | 逼逼av网站 | 亚洲人成在线播放 | 日韩美女在线 | 一级黄色免费毛片 | 久久大香 | 捆绑无遮挡打光屁股调教女仆 | 中文字幕第一页av | 中国色老太hd | 国产乱码久久久久久 | 黄色天堂| 国产一二三区在线视频 | 日日噜噜夜夜狠狠久久丁香五月 | 欧美色图3p | 国产伦精品一区二区三区视频痴汉 | av男人的天堂在线 | 国产福利片一区二区 | 久久草国产 | 男人激烈吮乳吃奶爽文 | 日韩美一级片 | 波多野结衣一区二区三区在线观看 | 90岁肥老奶奶毛毛外套 | 欧美婷婷六月丁香综合色 | 日本一区二区三区精品 | 亚洲香蕉在线观看 | 日本一区二区三区精品视频 | av亚州| 日韩网站免费 | 国产一区二区不卡视频 | 三级在线网站 | 播放一级黄色片 | 亚洲AV无码阿娇国产精品 | 久久久久久在线观看 | 国产欧美日韩精品在线观看 | 视频一区国产 |