51nod-1277: 字符串中的最大值
【传送门:51nod-1277】
简要题意:
给出一个长度为n的字符串,求出所有前缀的出现的次数*长度的最大值
题解:
一开始想着直接用KMP做,但是发现解决不了一个问题
改用EXKMP求,对于一个p[i],若p[i]不为0,则说明1到p[i]的位置的前缀出现的次数都多了一次
然后用差分搞一下就行了
参考代码:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; int p[110000]; char st[110000]; LL s[110000]; int main() { int len; scanf("%s",st+1); len=strlen(st+1); p[1]=len; int x=1; while(st[x]==st[x+1]&&x<=len) x++; p[2]=x-1; if(p[2]!=0) s[1]++,s[p[2]+1]--; int k=2; for(int i=3;i<=len;i++) { int pp=k+p[k]-1,L=p[i-k+1]; if(i+L<pp+1) p[i]=L; else { int j=pp-i+1; if(j<0) j=0; while(st[j+1]==st[i+j]&&i+j<=len) j++; p[i]=j; k=i; } if(p[i]!=0) { s[1]++;s[p[i]+1]--; } } LL ans=0; for(int i=1;i<=len;i++) { s[i]+=s[i-1]; ans=max(ans,(s[i]+1)*LL(i)); } printf("%lld\n",ans); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚