[BZOJ3790]神奇项链
生活随笔
收集整理的這篇文章主要介紹了
[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
abcdcbaabacada
abcdef
Sample Output
02
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Go】用 Go 访问 Redis
- 下一篇: 使用 TestFight 构建 Beta