日韩性视频-久久久蜜桃-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)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色无极亚洲影院 | 美女日批在线观看 | 3p在线视频| 制服诱惑一区二区 | 中文在线字幕免费观 | 黄色三级生活片 | 久草麻豆 | 一区二区三区爱爱 | 亚洲成年人在线 | 亚洲人成人网 | www.视频一区 | 久久国产色av | 不卡视频一区二区 | 99精品视频播放 | 欧美黑人一区二区 | 日美韩av| 日韩午夜免费视频 | 波多野结衣视频在线观看 | 中文天堂在线播放 | 精品人妻无码在线 | 日日干综合 | 啦啦啦视频在线观看 | 亚洲欧美伊人 | 亚洲中文字幕一区在线 | 天天做夜夜做 | 91高清无打码 | 欧美日韩伦理片 | 女同vk | 韩国三级丰满少妇高潮 | 2021国产在线视频 | 欧美浪妇xxxx高跟鞋交 | 97se视频| 丰满的女邻居 | 国产一区二区三区视频免费观看 | 精品成人av一区二区在线播放 | 伊人狠狠干 | 日本xx视频免费观看 | 大尺度叫床戏做爰视频 | 婷婷激情网站 | 久久久噜噜噜www成人网 | 午夜污片| 国产免费叼嘿网站免费 | 国产香蕉一区二区三区 | 免费网站观看www在线观看 | 国产最新自拍视频 | 国产又粗又猛又爽免费视频 | 懂色av蜜臀av粉嫩av分享吧最新章节 | 亚洲午夜影视 | 蜜桃视频一区二区 | 国产专区一区二区 | 免费在线一区二区三区 | 91国产大片| 久久久久久久一区二区 | 青青草视频黄 | 午夜精品成人毛片非洲 | 一区二区不卡视频在线观看 | 少妇一级淫片免费看 | 二区三区偷拍浴室洗澡视频 | 69av国产| 日日舔夜夜操 | 精品少妇一区二区三区在线观看 | av福利网 | 韩日产理伦片在线观看 | 伊人影院在线播放 | 天天添天天操 | 国产乱码精品1区2区3区 | 懂色aⅴ国产一区二区三区 亚洲欧美国产另类 | 国产区福利 | www成年人 | 亚洲第一页在线 | 人人爱人人| 成人av综合网 | 日韩成人av影院 | av在线地址| 国产综合一区二区 | 国产色视频网站 | 变态 另类 国产 亚洲 | 日韩欧美网 | 国产精品视频1区 | 亚洲aⅴ网站 | 亚洲啪啪免费视频 | 人人看人人看 | 二级毛片在线观看 | 开心综合网 | 日本久久精品视频 | 色婷婷综合网 | 青娱乐在线视频免费观看 | h网站免费在线观看 | 一级全黄裸体免费观看视频 | 免费激情视频网站 | 四虎在线免费播放 | 色综合一区二区 | 日韩一级片在线 | 人妻激情偷乱频一区二区三区 | 日本三级日本三级日本三级极 | www.黄色网址 | 中国在线观看片免费 | av高清在线 | 天堂网2020 |