bzoj 2124 神奇的树状数组+hash

来源:互联网 发布:《算法统宗》3个和尚 编辑:程序博客网 时间:2024/06/06 02:26

**调了一下午这道题,bzoj还必须要人把读入读完。
这道题关键是用树状数组来实现求类似等比数列的东东。
还有就是要想到转换成字符串比较是否是回文。
详细就懒得说了0 0,直接上代码。

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#define N 10010using namespace std;int t,n,x,power[N];int const mod=1000000007;struct abcd{    int c[N];    void clear(){memset(c,0,sizeof(c));}    void add(int pos){        for(int i=pos;i<=n;i+=(i&-i))//这个树状数组实际上是序号越大越小        c[i]=(c[i] + power[i-pos])%mod;    }    int q(int pos){        int rt=0;        for(int i=pos;i;i-=(i&-i))        rt=((long long)c[i]*power[pos-i] + rt)%mod;        return rt;    }    int query(int l,int r){        int xx=q(r),yy=q(l-1);        return ( xx-(long long)yy*power[r-l+1]%mod+mod )%mod;    }};abcd a1,a2;int main(){    scanf("%d",&t);    power[0]=1;    for(int i=1;i<N;i++)power[i]=(power[i-1]*2)%mod;    while(t--){        a1.clear();a2.clear();        scanf("%d",&n);        int i,flag=0;        for(i=1;i<=n;i++){            scanf("%d",&x);            int len=min(x-1,n-x);            if(len&&a1.query(x-len,x-1)!=a2.query(n-x-len+1,n-x))flag=1;            a1.add(x);            a2.add(n-x+1);        }        if(flag==1)printf("Y\n");        else printf("N\n");    }    return 0;}
原创粉丝点击