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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CodeForces - 1326D2 Prefix-Suffix Palindrome (Hard version)(马拉车/回文自动机)

發(fā)布時(shí)間:2024/4/11 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces - 1326D2 Prefix-Suffix Palindrome (Hard version)(马拉车/回文自动机) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:點(diǎn)擊查看

題目大意:給出一個(gè)字符串,求出截取前綴和后綴后拼接而成的最長回文串,前綴和后綴不能相交

題目分析:題意很簡單,思路也不難想,讀完題后我嘗試性的看了看樣例,發(fā)現(xiàn)前綴和后綴拼接后如果能夠形成回文串,那么有一段是可以直接抵消的,比如樣例 2 中的 abcdfdcecba ,我們可以分為三段來看?abcdfdcecba ,顯然前綴和后綴橙色的部分是可以抵消的,但是這個(gè)字符串的答案是 abcdfdcba ,也就是說除了可以抵消的前后綴,還可能會有藍(lán)色部分的回文前綴或回文后綴,因?yàn)榍懊娴窒牟糠直容^簡單,寫個(gè)雙指針亂搞一下就出來了,所以現(xiàn)在問題就轉(zhuǎn)換為了,如何求最長回文前綴或最長回文后綴

最長回文前綴和后綴,之前我是做過一個(gè)類似的題目,用馬拉車解決的,時(shí)間復(fù)雜度O(n),且常數(shù)小,只需要在內(nèi)部判斷一下是否為前綴或后綴就好了

或者可以直接用回文自動機(jī),O(n)建樹然后 len[ last?] 就是最長回文后綴,簡單無腦。。雖然有點(diǎn)殺雞用牛刀,但畢竟不用動腦子也不用改模板呀,還是比較舒服的

還有一種方法是二分+哈希,首先時(shí)間復(fù)雜度 nlogn ,相對于上面兩種方法就稍遜一點(diǎn)了,再加上這是cf,太容易被hack了,屬實(shí)不推薦

代碼:

馬拉車:

#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=1e6+100;char ss[N];char s[N*2];//預(yù)處理之后的字符串char str[N];//原本的字符串int p[N*2];//最長回文半徑bool front;int Manacher() {int k=0;s[k++]='!';for(int i=0;str[i];i++){s[k++]='#';s[k++]=str[i];}s[k++]='#';s[k]=0;int ans=0;p[0]=1;int id=0,mmax=0;for(int i=1;i<k;i++){if(i<mmax)p[i]=min(mmax-i,p[2*id-i]);elsep[i]=1;while(s[i-p[i]]==s[i+p[i]])p[i]++;if(i+p[i]>mmax){mmax=i+p[i];id=i;}if(i+p[i]==k||p[i]==i){if(ans>=p[i]-1)continue;ans=p[i]-1;if(i+p[i]==k)//后綴front=false;if(p[i]==i)//前綴front=true;}}return ans; }int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%s",ss+1);int n=strlen(ss+1);int l=1,r=n;deque<char>ans1,ans2;while(l<r&&ss[l]==ss[r]){ans1.push_back(ss[l]);ans2.push_front(ss[r]);l++,r--;}for(int i=l;i<=r;i++)str[i-l]=ss[i];str[r-l+1]=0;int len=Manacher();for(int i=0;i<ans1.size();i++)putchar(ans1[i]);if(front)for(int i=l;i<len+l;i++)putchar(ss[i]);elsefor(int i=r-len+1;i<=r;i++)putchar(ss[i]);for(int i=0;i<ans2.size();i++)putchar(ans2[i]);putchar('\n');}return 0; }

回文自動機(jī):

#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=1e6+100;char s[N];int n;struct Palindrome_tree {int nxt[N][26];int fail[N]; // 當(dāng)前節(jié)點(diǎn)最長回文后綴的節(jié)點(diǎn)int len[N]; // 當(dāng)前節(jié)點(diǎn)表示的回文串的長度int cnt[N]; // 當(dāng)前節(jié)點(diǎn)回文串的個(gè)數(shù), 在getcnt后可得到全部int sed[N]; // 以當(dāng)前節(jié)點(diǎn)為后綴的回文串的個(gè)數(shù)(并不是表示第i結(jié)尾的回文串的種類數(shù),如果要求每個(gè)點(diǎn)結(jié)尾的數(shù)的回文串個(gè)數(shù),得用last)int record[N]; //record記錄了節(jié)點(diǎn)回文串的結(jié)束位置char s[N];int tot; // 節(jié)點(diǎn)個(gè)數(shù)int last; // 上一個(gè)節(jié)點(diǎn)int n;//當(dāng)前字符串的長度 void newnode(){tot++;memset(nxt[tot],0,sizeof(nxt[tot]));cnt[tot]=sed[tot]=len[tot]=fail[tot]=0;}void init(){n=0;tot=-1;newnode();newnode();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é)點(diǎn)回文串新建兩端是否相等//n-len[x]-1<0這個(gè)是我自己加的,多組的時(shí)候光第一個(gè)條件是不夠的,所以有錯(cuò)請手動刪除x = fail[x]; // 若不同, 再比較x后綴回文串兩端return x;}void insert(char ch){int c = ch - 'a';//全小寫要用a 全大寫要用A 不然會錯(cuò)s[++n]=ch;int p = getfail(last, n);// 得到第i個(gè)字符可以加到哪個(gè)節(jié)點(diǎn)的兩端形成回文串if (!nxt[p][c]){newnode();len[tot] = len[p] + 2; // 在p節(jié)點(diǎn)兩端添加兩個(gè)字符fail[tot] = nxt[getfail(fail[p], n)][c]; //tot點(diǎn)的后綴回文,可以由上一個(gè)節(jié)點(diǎn)的后綴回文嘗試得到sed[tot] = sed[fail[tot]] + 1; // 以當(dāng)前節(jié)點(diǎn)為結(jié)尾的回文串個(gè)數(shù)nxt[p][c] = tot; // 新建節(jié)點(diǎn)}last = nxt[p][c]; // 當(dāng)前節(jié)點(diǎn)成為上一個(gè)節(jié)點(diǎn)cnt[last]++; //當(dāng)前節(jié)點(diǎn)回文串++record[last] = n;}void get_cnt(){for (int i = tot; i > 0; i--)cnt[fail[i]] += cnt[i];//fail[i] 的節(jié)點(diǎn) 為 i 節(jié)點(diǎn)的后綴回文串, 所以個(gè)數(shù)相加} }tree;int main() { #ifndef ONLINE_JUDGE // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); #endif // ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%s",s+1);n=strlen(s+1);int l=1,r=n;deque<char>ans1,ans2;while(l<r&&s[l]==s[r]){ans1.push_back(s[l]);ans2.push_front(s[r]);l++,r--;}bool front;int len=0;tree.init();for(int i=l;i<=r;i++)tree.insert(s[i]);if(tree.len[tree.last]>len){len=tree.len[tree.last];front=false;}tree.init();for(int i=r;i>=l;i--)tree.insert(s[i]);if(tree.len[tree.last]>len){len=tree.len[tree.last];front=true;}for(int i=0;i<ans1.size();i++)putchar(ans1[i]);if(front)for(int i=l;i<len+l;i++)putchar(s[i]);elsefor(int i=r-len+1;i<=r;i++)putchar(s[i]);for(int i=0;i<ans2.size();i++)putchar(ans2[i]);putchar('\n');}return 0; }

?

總結(jié)

以上是生活随笔為你收集整理的CodeForces - 1326D2 Prefix-Suffix Palindrome (Hard version)(马拉车/回文自动机)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 无套内谢少妇高潮免费 | 看一级黄色片 | hs视频在线观看 | 亚洲一区二区三区免费视频 | 日韩三级视频 | 黄色片子一级 | 精品国产午夜福利在线观看 | 国产男女在线 | 亚洲尻逼 | 女性向小h片资源在线观看 日本天天操 | 亚洲色图清纯唯美 | 国产性一乱一性一伧一色 | caoprom在线视频 | 日韩乱码人妻无码中文字幕 | 三级网站在线看 | 乳孔很大能进去的av番号 | 成年人免费网站 | 五月99久久婷婷国产综合亚洲 | 国产内射老熟女aaaa∵ | 国产精品3p视频 | julia一区二区三区中文字幕 | 使劲插视频 | 永久视频在线 | 3d动漫精品啪啪一区二区竹菊 | 日韩在线观看网址 | 国产一区二区三区四区 | 国产av无码专区亚洲av毛片搜 | 69视频一区二区三区 | 国产亚洲黄色片 | 日韩裸体视频 | 操你啦免费视频 | 波多野吉衣一区二区 | 欧美又粗又长又爽做受 | 国内视频一区二区三区 | 91视频免费观看 | 999国产精品亚洲77777 | 亚洲av综合色区无码二区爱av | 中文字字幕在线 | 欧美日韩综合一区二区 | 今天最新中文字幕mv高清 | 天天操女人| 毛片一区二区 | 亚洲4p| 中日韩欧美在线观看 | 一区二区三区视频观看 | 伊人视频 | 久久久久久久久久影院 | 亚洲精品日韩在线观看 | 免费欧美在线 | 成人精品二区 | 中文字幕综合在线 | 激情久久一区 | 性色av一区二区三区红粉影视 | 欧美影视一区二区 | 激情小说五月天 | 熟女少妇一区二区 | 国产h视频在线观看 | 久久噜噜噜 | 麻豆影视大全 | 校园伸入裙底揉捏1v1h | 欧美精品欧美精品系列 | 人人插人人爽 | 91性生活| 麻豆传媒在线免费 | 18成人在线观看 | 成人黄色短视频在线观看 | 日韩激情av在线 | 国产美女毛片 | 亚洲人人在线 | 一区二区免费 | 久久蜜桃精品 | 美女黄视频在线观看 | 无码无套少妇毛多18pxxxx | free性欧美hd精品4k | www.视频一区| 理想之城连续剧40集免费播放 | 日批网站在线观看 | 免费av电影网址 | 精品欧美| 久久视 | 国产成人a亚洲精v品无码 | 国产欧美色图 | www成人在线观看 | 欧美撒尿777hd撒尿 | 国产视频久久久 | 伊人久久大香线蕉综合75 | 国产精品国产三级国产专播品爱网 | 色婷婷狠狠干 | 九色91视频 | 第一福利av| 女人洗澡一级特黄毛片 | 操皮视频 | 99精品视频一区二区三区 | 精品国产乱码久久久久久久 | 亚洲女人天堂网 | 强开乳罩摸双乳吃奶羞羞www | 少妇激情一区二区三区视频 | 国产淫视频 | 中文无码日韩欧 |