zoukankan      html  css  js  c++  java
  • ping(NOIP模拟赛Round 4)第一次程序Rank 1!撒花庆祝!~(≧▽≦)/~

    题目:

     

    恩,就是裸的字符串处理啦。

    连标程都打的是暴力(随机数据太水啦!吐槽。)

    本来O(n^2q)TLE好吧。、

    然后我发明了一种神奇的算法,随机数据跑的很快!,当然最坏复杂度跟标程一样啦。

    不过期望复杂度是O(nq)是不是很快

    好吧说下我的做法,

    我用computer数组储存字符串,用iter[i]表示长度为i的字符串一共有几个

    sum[i][j]表示长度为i的第j个字符串。。

    所以就像哈希一样。。

    第一次跑的比标程快!O(∩_∩)O~~

    下面贴代码

    #include<iostream> 
    #include<cstdio> 
    #include<cstring> 
    using namespace std; 
    int sum[21][3001]; 
    int iter[3001],total=0; 
    char computer[3001][21]; 
    bool openq[3001]; 
    int ans=0; 
    int q; 
    int main(){ 
        //freopen("ping.in","r",stdin); 
        //freopen("ping.out","w",stdout); 
        scanf("%d",&q); 
        for(int i=1;i<=q;i++) 
        { 
            char mingling[4]; 
            scanf("%s",mingling); 
            if(mingling[0]=='S') 
            { 
                char qaq[21]; 
                scanf("%s",qaq); 
                int find; 
                int changdu=strlen(qaq);             
                for(int j=1;j<=iter[changdu];j++) 
                { 
                    bool cunzai=true; 
                    for(int k=0;k<changdu;k++) 
                        if(computer[sum[changdu][j]][k]!=qaq[k]){cunzai=false;break;} 
                    if(cunzai){find=sum[changdu][j];break;}   
                } 
                openq[find]=false;       
            } 
            else if(mingling[0]=='O') 
            { 
                char qaq[21]; 
                scanf("%s",qaq); 
                int find; 
                bool cunzai=false;           
                int changdu=strlen(qaq); 
                for(int j=1;j<=iter[changdu];j++) 
                { 
                    cunzai=true; 
                    for(int k=0;k<changdu;k++) 
                        if(computer[sum[changdu][j]][k]!=qaq[k]){cunzai=false;break;} 
                    if(cunzai){find=sum[changdu][j];break;}  
                } 
                if(!cunzai){ 
                    total++; 
                    for(int j=0;j<changdu;j++) 
                    computer[total][j]=qaq[j];   
                    sum[changdu][++iter[changdu]]=total; 
                    openq[total]=true; 
                } 
                else openq[find]=true; 
            }    
            else if(mingling[0]=='P') 
            { 
                char qaq[21]; 
                scanf("%s",qaq); 
                int changdu=strlen(qaq); 
                for(int j=1;j<=iter[changdu];j++) 
                { 
                    if(!openq[sum[changdu][j]])continue; 
                    bool cunzai=true; 
                    for(int k=0;k<changdu;k++) 
                    { 
                        if(computer[sum[changdu][j]][k]!=qaq[k]&&qaq[k]!='?'){cunzai=false;break;} 
                    } 
                    if(cunzai)ans++; 
                } 
                printf("%d
    ",ans); 
                ans=0;  
            }    
        } 
        return 0; 
        //fclose(stdin); 
        //fclose(stdout); 
    } 
  • 相关阅读:
    SQLSERVER 分区分表
    SQLSERVER 执行计划
    SQL SERVER 自定义函数
    codeforces 414C C. Mashmokh and Reverse Operation(归并排序求逆序对)
    codeforces 414A A. Mashmokh and Numbers(素数筛)
    codeforces 414B B. Mashmokh and ACM(dp)
    bzoj-1012 1012: [JSOI2008]最大数maxnumber(线段树)
    codeforces 665E E. Beautiful Subarrays(trie树)
    codeforces 667D D. World Tour(最短路)
    codeforces 667C C. Reberland Linguistics(dp)
  • 原文地址:https://www.cnblogs.com/ghostfly233/p/6910003.html
Copyright © 2011-2022 走看看