1. 程式人生 > >[bzoj3790] 神奇項鍊

[bzoj3790] 神奇項鍊

傳送門

跑完manacher之後,就變成線段覆蓋問題了。

從頭掃一遍貪心就行。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int n,tn;
 7 char in[50005];
 8 char s[100005];
 9 int pl[100005];
10 int r[100005];
11 
12 int main()
13 {
14     while(scanf("%s",in+1)!=EOF)
15 { 16 n=0; 17 tn=strlen(in+1); 18 for(int i=1;i<=tn;i++) 19 s[++n]='#',s[++n]=in[i]; 20 s[++n]='#'; 21 int np=1; 22 pl[1]=1; 23 for(int i=2;i<=n;i++) 24 { 25 pl[i]=min(pl[2*np-i],pl[np]+np-i);
26 for(;i+pl[i]<=n&&s[i+pl[i]]==s[i-pl[i]];pl[i]++); 27 if(i+pl[i]>np+pl[np])np=i; 28 r[i-pl[i]+1]=i+pl[i]-1; 29 } 30 int mx,p,ans=0; 31 mx=p=pl[1]+2; 32 for(int i=1;i<=n;i+=2) 33 { 34 if(i==p)p=mx,ans++;
35 mx=max(mx,r[i]+2); 36 } 37 printf("%d\n",ans-1); 38 } 39 return 0; 40 }