bzoj 2803 [Poi2012]Prefixuffix hash
2016-11-16 14:51
281 查看
设满足条件的两段为: 1~j , n-j+1~n。其中1~i和n-i+1~n相等,i+1~j和n-j+1~n-i相等。
那么从大到小枚举i,如果1~i和n-i+1~n相等,那么就是求最大的j使
i+1~i+j和n-i-j+1~n-i+1相等。设此时的j为f[i]。那么有f[i]<=f[i+1]+2。那么类似后缀数组求h的过程求一下f就行了。
那么从大到小枚举i,如果1~i和n-i+1~n相等,那么就是求最大的j使
i+1~i+j和n-i-j+1~n-i+1相等。设此时的j为f[i]。那么有f[i]<=f[i+1]+2。那么类似后缀数组求h的过程求一下f就行了。
#include <bits/stdc++.h> using namespace std; #define N 1100000 #define seed 1000007 #define mod 1000000009 #define ull unsigned long long int n,ans; char s ; ull has ,p ; ull get(int l,int r){return (has[r]-has[l-1]*p[r-l+1]%mod+mod)%mod;} int check(int x,int y,int v) {return get(x,x+v-1)==get(y-v+1,y);} int main() { scanf("%d%s",&n,s+1); p[0]=1; for(int i=1;i<=n;i++) { has[i]=(has[i-1]*seed%mod+s[i])%mod; p[i]=p[i-1]*seed%mod; } for(int i=n/2,j=0;i>=1;i--,j=min(j+2,n/2-i)) if(check(1,n,i)) { while(j&&!check(i+1,n-i,j)) j--; ans=max(ans,i+j); } printf("%d\n",ans); return 0; }
相关文章推荐
- 【BZOJ2803】[Poi2012]Prefixuffix【Hash】【单调性】
- BZOJ 2803: [Poi2012]Prefixuffix
- bzoj 2803 [POI2012]prefixuffix hsh+性质
- bzoj 2803: [Poi2012]Prefixuffix(双Hash)
- 【BZOJ2803】[Poi2012]Prefixuffix 结论题
- 【BZOJ 2803】【POI 2012】Prefixuffix
- BZOJ2803: [Poi2012]Prefixuffix
- BZOJ 2803 Poi2012 Prefixuffix Hash
- BZOJ2803: [Poi2012]Prefixuffix
- BZOJ2803: [Poi2012]Prefixuffix
- [BZOJ 2803]Poi2012 Prefixuffix
- [BZOJ2803][Poi2012]Prefixuffix
- 【BZOJ2803】【Poi2012】Prefixuffix hash+推性质
- bzoj 2795 [Poi2012]A Horrible Poem hash+线性筛
- bzoj 2796[Poi2012]Fibonacci Representation 贪心
- 【BZOJ2801】[Poi2012]Minimalist Security BFS
- BZOJ2794 : [Poi2012]Cloakroom
- BZOJ2795: [Poi2012]A Horrible Poem
- 【树状数组】bzoj2789 [Poi2012]Letters
- BZOJ2795/2890/3647 [Poi2012]A Horrible Poem 【字符串hash】