• 2016"百度之星"


    这次的百度之星,不得不吐槽下系统的判题数据,被坑了不知多少次。

    第一题:
    大意:求一段区间的累乘。用线段树即可。
    坑点:如果询问范围超出边界,输出上一次的结果。

    /*
    Problem :
    Status  :
    
    By wf,
    */
    
    #include "algorithm"
    #include "iostream"
    #include "cstring"
    #include "cstdio"
    #include "string"
    #include "stack"
    #include "cmath"
    #include "queue"
    #include "set"
    #include "map"
    
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    
    typedef long long ll;
    using namespace std;
    
    const int inf=0x3f3f3f3f;
    const int mod=9973;
    
    const int maxn = 1e6+5;
    
    char str[1000000+5];
    int sum[maxn<<2];
    int index;
    int len;
    
    void PushUP(int rt)
    {
        sum[rt] =( sum[rt<<1] * sum[rt<<1|1] )%mod;
    }
    void build(int l,int r,int rt)
    {
        if(l==r)
        {
    
            //printf("%c ",str[index]);
            sum[rt] = str[index++]-28;
        }
    
        if (l == r) return ;
        int m = (l + r) >> 1;
        build(lson);
        build(rson);
        PushUP(rt);
    }
    
    int query(int L,int R,int l,int r,int rt)
    {
        if (L <= l && r <= R)
        {
            return sum[rt];
        }
        int m = (l + r) >> 1;
        int ret = 1;
        if (L <= m) ret = (ret * query(L , R , lson) )%mod ;
        if (R > m) ret = (ret* query(L , R , rson) ) %mod;
        //printf("ret==%d
    ",ret);
        return ret;
    }
    
    int main()
    {
        //freopen("in_a.txt","r",stdin);
        int n,a,b;
        int ans = 0;
        while (~scanf("%d",&n))
        {
            index=0;
            scanf("%s",&str);
            len = strlen(str);
            build(1 , len  , 1);
    
            int a,b;
            for(int i=0;i<n;++i)
            {
                scanf("%d %d",&a,&b);
                if(a>=1 && a<=len && 1<=b && b<=len) ans = query(a,b,1,len,1);
                printf("%d
    ", query(a,b,1,len,1) );
            }
    
    
        }
    
        return 0;
    }
    

      


    第二题:
    多写几组数据就能发现:是求大数版的斐波那切数列。
    坑点:如果询问的是0,则输出空行。

    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    /*  * 完全大数模板  * 输出cin>>a  * 输出a.print();  * 注意这个输入不能自动去掉前导0的,可以先读入到char数组,去掉前导0,再用构造函数。  */
    #define MAXN 9999
    #define MAXSIZE 1010
    #define DLEN 4
    class BigNum
    {
    private:
        int a[500];  //可以控制大数的位数
        int len;
    public:
        BigNum()
        {
            len=1;    //构造函数
            memset(a,0,sizeof(a));
        }
        BigNum(const int);     //将一个int类型的变量转化成大数
        BigNum(const char*);   //将一个字符串类型的变量转化为大数
        BigNum(const BigNum &); //拷贝构造函数
        BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算
        friend istream& operator>>(istream&,BigNum&); //重载输入运算符
        friend ostream& operator<<(ostream&,BigNum&); //重载输出运算符
        BigNum operator+(const BigNum &)const;  //重载加法运算符,两个大数之间的相加运算
        BigNum operator-(const BigNum &)const;  //重载减法运算符,两个大数之间的相减运算
        BigNum operator*(const BigNum &)const;  //重载乘法运算符,两个大数之间的相乘运算
        BigNum operator/(const int &)const;     //重载除法运算符,大数对一个整数进行相除 运算
        BigNum operator^(const int &)const;     //大数的n次方运算
    
        int operator%(const int &)const;        //大数对一个int类型的变量进行取模运算
        bool operator>(const BigNum &T)const;   //大数和另一个大数的大小比较
        bool operator>(const int &t)const;      //大数和一个int类型的变量的大小比较
        void print();        //输出大数
    };
    BigNum::BigNum(const int b)   //将一个int类型的变量转化为大数
    {
        int c,d=b;
        len=0;
        memset(a,0,sizeof(a));
        while(d>MAXN)
        {
            c=d-(d/(MAXN+1))*(MAXN+1);
            d=d/(MAXN+1);
            a[len++]=c;
        }
        a[len++]=d;
    }
    BigNum::BigNum(const char *s)  //将一个字符串类型的变量转化为大数
    {
        int t,k,index,L,i;
        memset(a,0,sizeof(a));
        L=strlen(s);
        len=L/DLEN;
        if(L%DLEN)len++;
        index=0;
        for(i=L-1; i>=0; i-=DLEN)
        {
            t=0;
            k=i-DLEN+1;
            if(k<0)k=0;
            for(int j=k; j<=i; j++)             t=t*10+s[j]-'0';
            a[index++]=t;
        }
    }
    BigNum::BigNum(const BigNum &T):len(T.len)  //拷贝构造函数
    {
        int i;
        memset(a,0,sizeof(a));
        for(i=0; i<len; i++)         a[i]=T.a[i];
    }
    BigNum & BigNum::operator=(const BigNum &n)  //重载赋值运算符,大数之间赋值运算
    {
        int i;
        len=n.len;
        memset(a,0,sizeof(a));
        for(i=0; i<len; i++)         a[i]=n.a[i];
        return *this;
    }
    istream& operator>>(istream &in,BigNum &b)
    {
        char ch[MAXSIZE*4];
        int i=-1;
        in>>ch;
    
        int L=strlen(ch);
        int count=0,sum=0;
        for(i=L-1; i>=0;)
        {
            sum=0;
            int t=1;
            for(int j=0; j<4&&i>=0; j++,i--,t*=10)
            {
                sum+=(ch[i]-'0')*t;
            }
            b.a[count]=sum;
            count++;
        }
        b.len=count++;
        return in;
    }
    ostream& operator<<(ostream& out,BigNum& b)  //重载输出运算符
    {
        int i;
        cout<<b.a[b.len-1];
        for(i=b.len-2; i>=0; i--)
        {
            printf("%04d",b.a[i]);
        }
        return out;
    }
    BigNum BigNum::operator+(const BigNum &T)const   //两个大数之间的相加运算
    {
        BigNum t(*this);
        int i,big;
        big=T.len>len?T.len:len;
        for(i=0; i<big; i++)
        {
            t.a[i]+=T.a[i];
            if(t.a[i]>MAXN)
            {
                t.a[i+1]++;
                t.a[i]-=MAXN+1;
            }
        }
        if(t.a[big]!=0)        t.len=big+1;
        else t.len=big;
        return t;
    }
    BigNum BigNum::operator-(const BigNum &T)const  //两个大数之间的相减运算
    {
        int i,j,big;
        bool flag;
        BigNum t1,t2;
        if(*this>T)
        {
            t1=*this;
            t2=T;
            flag=0;
        }
        else
        {
    
            t1=T;
            t2=*this;
            flag=1;
        }
        big=t1.len;
        for(i=0; i<big; i++)
        {
            if(t1.a[i]<t2.a[i])
            {
                j=i+1;
                while(t1.a[j]==0)                 j++;
                t1.a[j--]--;
                while(j>i)                 t1.a[j--]+=MAXN;
                t1.a[i]+=MAXN+1-t2.a[i];
            }
            else t1.a[i]-=t2.a[i];
        }
        t1.len=big;
        while(t1.a[len-1]==0 && t1.len>1)
        {
            t1.len--;
            big--;
        }
        if(flag)         t1.a[big-1]=0-t1.a[big-1];
        return t1;
    }
    BigNum BigNum::operator*(const BigNum &T)const  //两个大数之间的相乘
    {
        BigNum ret;
        int i,j,up;
        int temp,temp1;
        for(i=0; i<len; i++)
        {
            up=0;
            for(j=0; j<T.len; j++)
            {
                temp=a[i]*T.a[j]+ret.a[i+j]+up;
                if(temp>MAXN)
                {
                    temp1=temp-temp/(MAXN+1)*(MAXN+1);
                    up=temp/(MAXN+1);
                    ret.a[i+j]=temp1;
                }
                else
                {
                    up=0;
                    ret.a[i+j]=temp;
                }
            }
            if(up!=0)            ret.a[i+j]=up;
        }
        ret.len=i+j;
        while(ret.a[ret.len-1]==0 && ret.len>1)ret.len--;
        return ret;
    
    }
    BigNum BigNum::operator/(const int &b)const  //大数对一个整数进行相除运算
    {
        BigNum ret;
        int i,down=0;
        for(i=len-1; i>=0; i--)
        {
            ret.a[i]=(a[i]+down*(MAXN+1))/b;
            down=a[i]+down*(MAXN+1)-ret.a[i]*b;
        }
        ret.len=len;
        while(ret.a[ret.len-1]==0 && ret.len>1)         ret.len--;
        return ret;
    }
    int BigNum::operator%(const int &b)const   //大数对一个 int类型的变量进行取模
    {
        int i,d=0;
        for(i=len-1; i>=0; i--)         d=((d*(MAXN+1))%b+a[i])%b;
        return d;
    }
    BigNum BigNum::operator^(const int &n)const  //大数的n次方运算
    {
        BigNum t,ret(1);
        int i;
        if(n<0)exit(-1);
        if(n==0)return 1;
        if(n==1)return *this;
        int m=n;
        while(m>1)
        {
            t=*this;
            for(i=1; (i<<1)<=m; i<<=1)            t=t*t;
            m-=i;
            ret=ret*t;
            if(m==1)ret=ret*(*this);
        }
        return ret;
    }
    bool BigNum::operator>(const BigNum &T)const    //大数和另一个大数的大小比较
    {
        int ln;
        if(len>T.len)return true;
        else if(len==T.len)
        {
            ln=len-1;
            while(a[ln]==T.a[ln]&&ln>=0)           ln--;
            if(ln>=0 && a[ln]>T.a[ln])            return true;
            else            return false;
        }
        else        return false;
    }
    
    bool BigNum::operator>(const int &t)const  //大数和一个int类型的变量的大小比较
    {
        BigNum b(t);
        return *this>b;
    }
    void BigNum::print()   //输出大数
    {
        int i;
        printf("%d",a[len-1]);
        for(i=len-2; i>=0; i--)       printf("%04d",a[i]);
        printf("
    ");
    }
    BigNum f[250];//卡特兰数
    int main()
    {
        //freopen("in_b.txt","r",stdin);
        f[1]="1";
        f[2]="2";
        for(int i=3; i<=210; i++) f[i]=f[i-1]+f[i-2];
        int n;
        while(cin>>n)
        {
            if(n==0)
            {
                cout<<endl;
                continue;
            }
            cout<<f[n]<<endl;
        }
        return 0;
    }
    

      



    第三题:
    字典树。

    /*
    Problem :
    Status  :
    
    By wf,
    */
    
    #include "algorithm"
    #include "iostream"
    #include "cstring"
    #include "cstdio"
    #include "string"
    #include "stack"
    #include "cmath"
    #include "queue"
    #include "set"
    #include "map"
    
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    
    typedef long long ll;
    using namespace std;
    
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+5;
    
    #define MAX 26
    struct Trie
    {
        Trie *next[MAX];
        int v;   //根据需要变化
    
        Trie()
        {
            v=0;
            for(int i=0; i<MAX; ++i)
            {
                next[i]=NULL;
            }
        }
    };
    
    Trie *root;
    
    void Insert(char *str)
    {
        //printf("insert:%s
    ",str);
        int len = strlen(str);
        Trie *p = root, *q;
        for(int i=0; i<len; ++i)
        {
            int id = str[i]-'a';
            if(p->next[id]==NULL)
                p->next[id]=new Trie();
            p=p->next[id];
            p->v++;
        }
    }
    int Search(char *str)
    {
        //printf("search:%s
    ",str);
        int len = strlen(str);
        Trie *p = root;
        for(int i=0; i<len; ++i)
        {
            int id = str[i]-'a';
            p = p->next[id];
            if(p == NULL)   //若为空集,表示不存以此为前缀的串
                return 0;
    
            //printf("%c v:%d
    ",str[i],p->v);
        }
        return p->v;
    }
    void Delete(char * str)
    {
        //printf("delete:%s
    ",str);
        int len = strlen(str);
    
        //取删除单词的个数
        int num = Search(str);
        Trie *p = root;
        /*for(int i=0; i<len; ++i)
        {
            int id = str[i]-'a';
            p = p->next[id];
            if(p == NULL)   //若为空集,表示不存以此为前缀的串
                break ;
            //printf("->%c ",str[i]);
            num = min(num,p->v) ;
        }*/
    
        //printf("num==%d
    ",num);
    
        //这次再删
        p = root;
        for(int i=0; i<len; ++i)
        {
            int id = str[i]-'a';
            p = p->next[id];
            if(p == NULL)   //若为空集,表示不存以此为前缀的串
                return ;
            //printf("->%c ",str[i]);
            p->v -= num;
            if(p->v ==0)
            {
                for(int i=0; i<26; ++i)
                {
                    p->next[i]=NULL;
                }
                p=NULL;
                return;
            }
        }
        return ;
    }
    
    
    
    int main()
    {
        //freopen("in_c.txt","r",stdin);
        int n;
        scanf("%d",&n);
        char cmd[20],str[5000];
        int len;
        root = new Trie();
        while(n--)
        {
            //cin>>cmd>>str;
            scanf("%s %s",&cmd,&str);
            switch( cmd[0] )
            {
            case 'i':
                Insert(str);
                break;
            case 'd':
                Delete(str);
                break;
            case 's':
                if( Search(str) )
                {
                    cout<<"Yes"<<endl;
                }
                else cout<<"No"<<endl;
                break;
            }
        }
    
        return 0;
    }
    

      



    第四题:
    水题,string排序+map。

    /*
    Problem :
    Status  :
    
    By wf,
    */
    
    #include "algorithm"
    #include "iostream"
    #include "cstring"
    #include "cstdio"
    #include "string"
    #include "stack"
    #include "cmath"
    #include "queue"
    #include "set"
    #include "map"
    
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    
    typedef long long ll;
    using namespace std;
    
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+5;
    
    map<string,int>mp;
    int main()
    {
        //freopen("in_d.txt","r",stdin);
        int n;
        string str;
        cin>>n;
        while(n--)
        {
            cin>>str;
            sort(str.begin(),str.end() );
            cout<<mp[str]<<endl;
    
                mp[str]++;
    
        }
    
        return 0;
    }
    

      



    第五题:
    大意:给你一些语句,如果从第i-1行的语句和第i行的语句不能找到满足条件的变量值,输出第i-1的编号;否则输出unique。
    不难,处理好字符串就行了。

    /*
    Problem :
    Status  :
    
    By wf,
    */
    
    #include "algorithm"
    #include "iostream"
    #include "cstring"
    #include "cstdio"
    #include "string"
    #include "stack"
    #include "cmath"
    #include "queue"
    #include "set"
    #include "map"
    
    #define lson l , m , rt << 1
    #define rson m + 1 , r , rt << 1 | 1
    
    typedef long long ll;
    using namespace std;
    
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+5;
    
    struct node
    {
        string name;
        int l,r;
    } var[50005];
    
    struct node2
    {
        int num;
        int varid[50];
        bool flag;
    } p[1005];
    
    map<string,int>mp;
    
    bool iskong(int l1,int r1,int l2,int r2)
    {
        if( l2>r1 || l1>r2 )return 1;
        return 0;
    }
    
    int main()
    {
        //freopen("in_e.txt","r",stdin);
        string str;
        int n;
        cin>>n;
        getchar();
        int id = 1;
        for(int ii=0; ii<n; ii++)
        {
            getline(cin,str);
            //cout<<str<<endl;
            int i=0,j,len = str.length();
            p[ii].num=0;
            p[ii].flag=false;
    
            while(i<len)
            {
                while(i<len && str[i]==' ' )i++;
                if( isalpha(str[i]) )
                {
                    //获取变量名
                    j=i+1;
                    while(j<len && isalpha(str[j]) )++j;
                    var[id].name = str.substr(i,j-i);
                    i=j;
    
                    //获取运算符
                    int ops=0;
                    while(i<len && str[i]==' ' )i++;
                    if( str[i]=='<' && str[i+1]!='=' )
                    {
                        ops=1;
                        i++;
                    }
                    else if( str[i]=='>' && str[i+1]!='=' )
                    {
                        ops=2;
                        i++;
                    }
                    else if( str[i]=='<' && str[i+1]=='=' )
                    {
                        ops=3;
                        i+=2;
                    }
                    else if( str[i]=='>' && str[i+1]=='=' )
                    {
                        ops=4;
                        i+=2;
                    }
                    else if( str[i]=='=' && str[i+1]=='=' )
                    {
                        ops=5;
                        i+=2;
                    }
    
                    //获取数字
                    int num=0;
                    while(i<len && str[i]==' ')i++;
                    if( isdigit(str[i]) )
                    {
                        num = str[i]-'0';
                        j=i+1;
                        while(j<len && isdigit(str[j]) )
                        {
                            num = num*10 + str[j] - '0';
                            j++;
                        }
                        i=j;
                    }
    
                    //处理
                    switch(ops)
                    {
                    case 1: //<
                        var[id].l = -10000;
                        var[id].r = num-1;
                        break;
                    case 2: //>
                        var[id].l = num+1;
                        var[id].r = 10000;
                        break;
                    case 3: //<=
                        var[id].l = -10000;
                        var[id].r = num;
                        break;
                    case 4: //>=
                        var[id].l = num;
                        var[id].r = 10000;
                        break;
                    case 5: //==
                        var[id].l = num;
                        var[id].r = num;
                        break;
                    }
    
                    //判断这个条件是否为空
                    //printf("dangqian num:%d
    ",p[ii].num);
                    for(int t=0; t<p[ii].num; t++)
                    {
                        int tid = p[ii].varid[t];
                        //cout<<"name1:"<<var[id].name<<" name2:"<<var[tid].name<<endl;
                        if( var[id].name == var[tid].name && iskong(var[tid].l,var[tid].r,var[id].l,var[id].r) )
                        {
                            p[ii].flag=1;
                            //printf("debug
    ");
                        }else
                        {
                            var[id].l = max( var[id].l , var[tid].l );
                            var[tid].l = var[id].l;
                            var[id].r = min( var[id].r , var[tid].r );
                            var[tid].r = var[id].r;
                        }
                    }
    
    
                    //处理完毕
                    //cout<<name<<" ops=="<<ops<<" num=="<<num<<" l=="<<var[id].l<<" r=="<<var[id].r<<" flag=="<<p[ii].flag<<endl;
    
                    p[ii].varid[ p[ii].num++]=id;
                    id++;
    
                    while(i<len && str[i]==' ')i++;
                    if( i<len && str[i]==',' )
                    {
                        i++;
                    }
    
                }
                else i++;
            }
    
            if( p[ii].flag )
            {
                cout<<"unique"<<endl;
                continue;
            }
    
            bool isUnique=true;
            bool first = 1;
    
            for(int jj=0; jj<ii; ++jj)
            {
                bool isThisOk =1;
                if( p[jj].flag )continue;
                else
                {
                    for(int k1 = 0; k1<p[ii].num; k1++)
                    {
                        for(int k2 = 0; k2<p[jj].num; k2++)
                        {
                            if(!isThisOk )break;
                            int tid1 = p[ii].varid[k1];
                            int tid2 = p[jj].varid[k2];
    
                            //printf("[%d,%d] [%d,%d]
    ",var[tid1].l,var[tid1].r,var[tid2].l,var[tid2].r);
                            //cout<<"name1:"<<var[tid1].name<<" name2:"<<var[tid2].name<<endl;
                            if( var[tid1].name == var[tid2].name && iskong(var[tid1].l,var[tid1].r,var[tid2].l,var[tid2].r) )
                            {
                                isThisOk=0;
                                //printf("ok
    ");
                                break;
                            }
                        }
                    }
                }
    
                if( isThisOk )
                {
                    isUnique=false;
                    if(first)first=0;
                    else cout<<" ";
                    cout<<jj+1;
                }
    
            }
            if( isUnique )cout<<"unique"<<endl;
            else cout<<endl;
    
            //cout<<endl;
        }
        return 0;
        return 0;
    }
    

      

  • 相关阅读:
    shell中标准输出,标准输入,标准错误输出详解
    shell 脚本 编辑颜色代码
    Docker容器:磁盘&内存&CPU资源限制实战
    Linux crontab 详解
    vsftp虚拟用户
    学习kail linux 几个不错的网站
    多线程协作方法sleep、yield、wait、join和同步和安全等问题
    Redis 命令参考
    JVM的内存区域划分(网上找的)
    工业软硬件系统名词
  • 原文地址:https://www.cnblogs.com/bruce27/p/5497692.html
Copyright © 2020-2023  润新知