BZOJ2081 [Poi2010]Beads

来源:互联网 发布:大数据产业面临的问题 编辑:程序博客网 时间:2024/06/07 03:59

对于每个长度把所有的串拿出来哈希判即可,哈希一个log,由调和级数复杂度是n log^2的

但是这题鬼畜的地方在于哈希……双模双base都被卡了……但是设模98754321,base=2333就能过……

另外有个优化,如果当前长度乘当前最多个数大于n了,那么大于等于当前长度的长度就不可能更新答案了,可以直接break掉

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<vector>#include<map>#include<set>#include<bitset>#include<queue>#include<stack>using namespace std;#define MAXN 200010#define MAXM 1010#define INF 1000000000#define MOD 1000000007#define eps 1e-8#define ll long longchar xB[1<<15],*xS=xB,*xT=xB;#define getc() (xS==xT&&(xT=(xS=xB)+fread(xB,1,1<<15,stdin),xS==xT)?0:*xS++)inline int read(){int x=0,f=1;char ch=getc();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getc();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getc();}return x*f;}int bas=2333;int p=98754321; int h[2][MAXN];int mi[MAXN];int n;int a[MAXN];map<int,bool>H;int ans[MAXN];int anst,ansv;int ANS[MAXN];int get(int x,int l,int r){if(x==0){return ((ll)h[x][r]-(ll)h[x][l-1]*mi[r-l+1]%p+p)%p;}return ((ll)h[x][l]-(ll)h[x][r+1]*mi[r-l+1]%p+p)%p;}int main(){/*freopen("kor12c.in","r",stdin);freopen("dui.txt","w",stdout);//*/int i,j;n=read();for(i=1;i<=n;i++){a[i]=read();}mi[0]=1;for(i=1;i<=n;i++){mi[i]=((ll)mi[i-1]*bas)%p;h[0][i]=((ll)h[0][i-1]*bas+a[i])%p;}for(i=n;i;i--){h[1][i]=((ll)h[1][i+1]*bas+a[i])%p;}for(i=1;i*ansv<=n;i++){H.clear();for(j=1;j+i-1<=n;j+=i){int h0=get(0,j,j+i-1);int h1=get(1,j,j+i-1);if(!H[h0]||!H[h1]){H[h0]=1;H[h1]=1;ans[i]++;}}if(ans[i]>ansv){ansv=ans[i];anst=0;}if(ans[i]==ansv){anst++;}}printf("%d %d\n",ansv,anst);anst=0;for(i=1;i<=n;i++){if(ans[i]==ansv){ANS[++anst]=i;}}for(i=1;i<anst;i++){printf("%d ",ANS[i]);}printf("%d\n",ANS[anst]);return 0;}/**/


0 0
原创粉丝点击