zoukankan      html  css  js  c++  java
  • 【WC2017】挑战

      卡常真好玩,卡到了loj rank1(2019.1.29)

    // luogu-judger-enable-o2
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    typedef unsigned int u32;
    typedef unsigned long long u64;
    
    inline void output_arr(u32 *A, u32 size) {
        u32 ret = size * sizeof(u32);
        u32 x = 23333333;
        const u32 * ed = A + size;
        for (u32*i=A;i!=ed; ++ i){
            ret^=*i+x,x^=x<<13,x^=x>>17,x^=x<<5;
        }
        printf("%u
    ", ret);
    }
    
    namespace Sorting {
        int cnt0[256],cnt8[256],cnt16[256],cnt24[256];
        u32 *a,*b;
        inline void init_data(u32 *a, int n,u32 seed) {
            const u32 * ed = a + n;
            for (u32*i = a; i != ed; ++ i){
                seed ^= seed << 13,seed ^= seed >> 17,seed ^= seed << 5;
                *i=seed;
                ++cnt0[seed & 255], ++cnt8[seed >> 8 & 255],
                ++cnt16[seed >> 16 & 255], ++cnt24[seed >> 24];
            }
            for(int i=1;i<256;++i)
                cnt0[i] += cnt0[i-1],
                cnt8[i] += cnt8[i-1],
                cnt16[i] += cnt16[i-1],
                cnt24[i] += cnt24[i-1];
            register u32*i;
            for(i=a+n-1;i>a;i-=8){
                b[--cnt0[*i&255]]=*i;
                b[--cnt0[i[-1]&255]]=i[-1];
                b[--cnt0[i[-2]&255]]=i[-2];
                b[--cnt0[i[-3]&255]]=i[-3];
                b[--cnt0[i[-4]&255]]=i[-4];
                b[--cnt0[i[-5]&255]]=i[-5];
                b[--cnt0[i[-6]&255]]=i[-6];
                b[--cnt0[i[-7]&255]]=i[-7];
            }
            for(i=b+n-1;i>b;i-=8){
                a[--cnt8[*i>>8&255]]=*i;
                a[--cnt8[i[-1]>>8&255]]=i[-1];
                a[--cnt8[i[-2]>>8&255]]=i[-2];
                a[--cnt8[i[-3]>>8&255]]=i[-3];
                a[--cnt8[i[-4]>>8&255]]=i[-4];
                a[--cnt8[i[-5]>>8&255]]=i[-5];
                a[--cnt8[i[-6]>>8&255]]=i[-6];
                a[--cnt8[i[-7]>>8&255]]=i[-7];
            }
            for(i=a+n-1;i>a;i-=8){
                b[--cnt16[*i>>16&255]]=*i;
                b[--cnt16[i[-1]>>16&255]]=i[-1];
                b[--cnt16[i[-2]>>16&255]]=i[-2];
                b[--cnt16[i[-3]>>16&255]]=i[-3];
                b[--cnt16[i[-4]>>16&255]]=i[-4];
                b[--cnt16[i[-5]>>16&255]]=i[-5];
                b[--cnt16[i[-6]>>16&255]]=i[-6];
                b[--cnt16[i[-7]>>16&255]]=i[-7];
            }
            for(i=b+n-1;i>b;i-=8){
                a[--cnt24[*i>>24]]=*i;
                a[--cnt24[i[-1]>>24]]=i[-1];
                a[--cnt24[i[-2]>>24]]=i[-2];
                a[--cnt24[i[-3]>>24]]=i[-3];
                a[--cnt24[i[-4]>>24]]=i[-4];
                a[--cnt24[i[-5]>>24]]=i[-5];
                a[--cnt24[i[-6]>>24]]=i[-6];
                a[--cnt24[i[-7]>>24]]=i[-7];
            }
        }
        int n;
        inline void main() {
            register u32 seed;
            scanf("%d%u", &n, &seed);
            a = new u32[n<<1];
            b = a + n;
            init_data(a, n, seed);
            output_arr(a, n);
        }
    }
    
    namespace Game {
        int n,q;
    
        u64 f1[64][20000];
        u64 f2[64][20000];
        inline void add(u64 f[64][20000],int bit){
            if(bit < 64)
                for(int i=0;i<=bit;++i)
                    *f[i]|=1ull<< bit-i;
            else for(int i=0;i<64;++i)
                    f[i][bit-i>>6] |= 1ull << (bit-i&63);
        }
        inline void init(char * s1,char * s2){
            for(int i=0;i<n;++i){
                if(s1[i]=='0')add(f1,i*3);
                if(s1[i]=='1')add(f1,i*3+1);
                if(s1[i]=='2')add(f1,i*3+2);
                if(s2[i]=='0')add(f2,i*3+2);
                if(s2[i]=='1')add(f2,i*3);
                if(s2[i]=='2')add(f2,i*3+1);
            }
        }
        void main() {
            scanf("%d%d", &n, &q);
            char *s1 = new char[n + 1];
            char *s2 = new char[n + 1];
            scanf("%s%s", s1, s2);
            init(s1,s2);
            u32 *anss = new u32[q];
            for (int k = 0; k < q; ++k) {
                int x,y,len;
                scanf("%d%d%d",&x,&y,&len);
                x*=3,y*=3,len*=3;
                int l = len >> 6;
                u64*i=f1[x&63]+(x>>6),*j=f2[y&63]+(y>>6);
                int ans=0,cnt=0;
                for(;cnt+8<l;cnt+=8,i+=8,j+=8){
                    ans+=__builtin_popcountll(i[0]&j[0]);
                    ans+=__builtin_popcountll(i[1]&j[1]);
                    ans+=__builtin_popcountll(i[2]&j[2]);
                    ans+=__builtin_popcountll(i[3]&j[3]);
                    ans+=__builtin_popcountll(i[4]&j[4]);
                    ans+=__builtin_popcountll(i[5]&j[5]);
                    ans+=__builtin_popcountll(i[6]&j[6]);
                    ans+=__builtin_popcountll(i[7]&j[7]);
                }
                for(;cnt<l;++cnt,++i,++j) ans+=__builtin_popcountll(*i&*j);
                anss[k]=ans+__builtin_popcountll(*i&*j&(1ull<<(len&63))-1);
            }
            output_arr(anss, q);
        }
    }
    
    namespace Parentheses {
        u32 f[366666*2],*id=f+366666;
        u32 p[366666*2],*g=p+366666;
        int cur=1;
        void main() {
            int n;
            scanf("%d", &n);
            char *s = new char[n + 1];
            scanf("%s", s);
            id[0]=1;
            for(int i=0;i<n;++i){
                if(s[i] == ')')
                    *id++=0;
                if(s[i] == '(')
                    *--id=0;
                if (i !=n-1 && s[i] == '?' && s[i+1] == '?'){
                    *--id=0,*--id=0;
                    id[0]=id[2]+id[4];
                    id[1]=id[3]*2+id[5];
                    const int ed=std::min(i+4,n - i + 4);
                    for(int j=2+(i&1);j<=ed;){
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                        id[j] += id[j+2]*2 + id[j+4],j+=2;
                    }
                    ++i;
                    continue;
                }
                if(s[i] == '?'){
                    *--id=0;
                    const int ed=std::min(i+2,n-i+2);
                    for(u32 j=!(i&1);j<=ed;){
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                        id[j]+=id[j+2],j+=2;
                    }
                }
            }
            printf("%u
    ", id[0]);
        }
    }
    
    int main() {
        int task_id;
        scanf("%d", &task_id);
    
        switch (task_id) {
            case 1:
                Sorting::main();
                break;
            case 2:
                Game::main();
                break;
            case 3:
                Parentheses::main();
                break;
        }
    
        return 0;
    }
    

      

  • 相关阅读:
    内核并发管理---spin lock
    redhat samba安装配置
    内核系统调用接口分析
    kernel makefile
    你知道C#中的Lambda表达式的演化过程吗?
    农码一生博文索引
    那些年搞不懂的术语、概念:协变、逆变、不变体
    Asp.Net生命周期
    ASP.NET配置文件Web.config 详细解释
    加盐密码哈希:如何正确使用
  • 原文地址:https://www.cnblogs.com/skip1978/p/10332528.html
Copyright © 2011-2022 走看看