跑完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 ",ans-1); 38 } 39 return 0; 40 }