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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[BZOJ3790]神奇项链

發(fā)布時(shí)間:2023/12/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ3790]神奇项链 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Description

母親節(jié)就要到了,小 H 準(zhǔn)備送給她一個(gè)特殊的項(xiàng)鏈。這個(gè)項(xiàng)鏈可以看作一個(gè)用小寫字 母組成的字符串,每個(gè)小寫字母表示一種顏色。為了制作這個(gè)項(xiàng)鏈,小 H 購(gòu)買了兩個(gè)機(jī)器。第一個(gè)機(jī)器可以生成所有形式的回文串,第二個(gè)機(jī)器可以把兩個(gè)回文串連接起來(lái),而且第二個(gè)機(jī)器還有一個(gè)特殊的性質(zhì):假如一個(gè)字符串的后綴和一個(gè)字符串的前綴是完全相同的,那么可以將這個(gè)重復(fù)部分重疊。例如:aba和aca連接起來(lái),可以生成串a(chǎn)baaca或 abaca。現(xiàn)在給出目標(biāo)項(xiàng)鏈的樣式,詢問你需要使用第二個(gè)機(jī)器多少次才能生成這個(gè)特殊的項(xiàng)鏈。?

Input

輸入數(shù)據(jù)有多行,每行一個(gè)字符串,表示目標(biāo)項(xiàng)鏈的樣式。?

Output

多行,每行一個(gè)答案表示最少需要使用第二個(gè)機(jī)器的次數(shù)。?

Sample Input

abcdcba
abacada
abcdef

Sample Output

0
2
5

HINT

每個(gè)測(cè)試數(shù)據(jù),輸入不超過(guò) 5行?
每行的字符串長(zhǎng)度小于等于 50000?

Source

?

還是很容易想到搞成區(qū)間覆蓋問題的,然后貪心一下就行了

代碼:

1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define M 100010 6 using namespace std; 7 int n,N,ans,now,r,mx; 8 int len[M],p[M]; 9 char a[M],s[M*2]; 10 void change() 11 { 12 s[0]='&'; 13 for(int i=0;i<N;i++) 14 { 15 s[++n]='#'; 16 s[++n]=a[i]; 17 } 18 s[++n]='#'; 19 } 20 void manacher() 21 { 22 int maxright=0,mid; 23 for(int i=1;i<=n;i++) 24 { 25 if(i<maxright) len[i]=min(len[mid*2-i],maxright-i); 26 else len[i]=1; 27 while(s[i-len[i]]==s[i+len[i]]) len[i]++; 28 if(len[i]+i>maxright) 29 { 30 maxright=len[i]+i; 31 mid=i; 32 } 33 } 34 } 35 struct point{ 36 int l,r; 37 }b[M]; 38 bool cmp(point a1,point a2) {return a1.l<a2.l||(a1.l==a2.l&&a1.r>a2.r);} 39 int main() 40 { 41 while(scanf("%s",a)!=EOF) 42 { 43 N=strlen(a); 44 n=0; 45 int cnt=0; 46 change(); 47 manacher(); 48 for(int i=1;i<=n;i++) b[++cnt].l=i-len[i]+1,b[cnt].r=i+len[i]-1; 49 sort(b+1,b+1+cnt,cmp); 50 r=b[1].r;ans=1;now=2; 51 while(r<n) 52 { 53 mx=r; 54 while(now<=cnt&&b[now].l<=r) 55 { 56 mx=max(mx,b[now].r); 57 now++; 58 } 59 ++ans;r=mx; 60 } 61 printf("%d\n",ans-1); 62 } 63 return 0; 64 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Slrslr/p/9498923.html

總結(jié)

以上是生活随笔為你收集整理的[BZOJ3790]神奇项链的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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