[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 }

 

posted @ 2018-11-26 13:10  cervusky  阅读(224)  评论(0编辑  收藏  举报

Contact with me