• 2016"百度之星"


    简单模拟题,耐心写就能过。

    #include <stdio.h>
    #include <math.h>
    #include<cstring>
    #include<cmath>
    #include<map>
    #include<string>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    const int INF=20000;
    int n;
    struct X
    {
        char s[1000];
        int L[35],R[35];
    } h[1000+10];
    
    map<string,int>m;
    int cnt;
    char tmp[1000];
    
    char Na[1000];
    int op,num;
    int L,R;
    
    void get()
    {
        memset(Na,0,sizeof Na);
        int i;
        for(i=0; tmp[i]; i++)
        {
            if(tmp[i]==' ') continue;
            else break;
        }
    
        int g=0;
        for(; tmp[i]; i++)
        {
            if(tmp[i]>='a'&&tmp[i]<='z') Na[g++]=tmp[i];
            else break;
        }
    
        for(; tmp[i]; i++)
        {
            if(tmp[i]==' ') continue;
            else break;
        }
    
        if(tmp[i]=='<')
        {
            if(tmp[i+1]=='=') op=2;
            else op=1;
        }
        if(tmp[i]=='=') op=3;
        if(tmp[i]=='>')
        {
            if(tmp[i+1]=='=') op=4;
            else op=5;
        }
    
        num=0;
        int u=1;
        for(; tmp[i]; i++)
        {
            if(tmp[i]=='-') u=-1;
            if(tmp[i]>='0'&&tmp[i]<='9') num=num*10+tmp[i]-'0';
        }
        num=num*u;
    
        if(op==3) L=R=num;
        else  if(op==1) L=-INF,R=num-1,op=2;
        else if(op==2) L=-INF,R=num;
        else if(op==4) L=num,R=INF;
        else if(op==5) L=num+1,R=INF,op=4;
    }
    
    bool check(int a,int b)
    {
        for(int i=1; i<=30; i++)
        {
            if(h[a].L[i]==-774388357) return 0;
            if(h[b].L[i]==-774388357) return 0;
        }
    
        for(int i=1; i<=30; i++)
        {
            if(h[a].R[i]<h[b].L[i]) return 0;
            if(h[a].L[i]>h[b].R[i]) return 0;
        }
        return 1;
    }
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            getchar();
            m.clear();
            cnt=0;
            for(int i=1; i<=n; i++) gets(h[i].s);
            for(int i=1; i<=n; i++)
            {
                int len=strlen(h[i].s);
                char name[35];
                int tot=0;
                memset(name,0,sizeof name);
                for(int j=0; j<len; j++)
                {
                    if(h[i].s[j]>='a'&&h[i].s[j]<='z')  name[tot++]=h[i].s[j];
                    else
                    {
                        if(name[0]==0) continue;
                        if(m[name]==0) m[name]=++cnt;
                        tot=0;
                        memset(name,0,sizeof name);
                    }
                }
            }
    
            for(int i=1; i<=n; i++)
            {
                int len=strlen(h[i].s);
                int pos=0;
                memset(tmp,0,sizeof tmp);
                int f=0;
    
                for(int j=1; j<=30; j++) h[i].L[j]=-INF,h[i].R[j]=INF;
    
                while(pos<=len)
                {
                    if(h[i].s[pos]==','||h[i].s[pos]==0)
                    {
                        get();
    
                        if(h[i].L[m[Na]]!=-774388357)
                        {
                            if(op==2)
                            {
                                if(R<h[i].L[m[Na]]) h[i].L[m[Na]]=h[i].R[m[Na]]=-774388357;
                                else h[i].R[m[Na]]=min(h[i].R[m[Na]],R);
                            }
                            if(op==3)
                            {
                                if(h[i].L[m[Na]]<=L&&L<=h[i].R[m[Na]]) h[i].L[m[Na]]=h[i].R[m[Na]]=L;
                                else h[i].L[m[Na]]=h[i].R[m[Na]]=-774388357;
                            }
                            if(op==4)
                            {
                                if(L>h[i].R[m[Na]]) h[i].L[m[Na]]=h[i].R[m[Na]]=-774388357;
                                else h[i].L[m[Na]]=max(h[i].L[m[Na]],L);
                            }
                        }
                        memset(tmp,0,sizeof tmp);
                        f=0;
                    }
                    else tmp[f++]=h[i].s[pos];
                    pos++;
                }
            }
            
            for(int i=1; i<=n; i++)
            {
                bool fail=0;
                vector<int>v;
    
                for(int j=1; j<i; j++)
                    if(check(j,i))
                    {
                        fail=1;
                        v.push_back(j);
                    }
    
                if(fail==0) printf("unique
    ");
                else
                {
                    for(int j=0; j<v.size(); j++)
                    {
                        printf("%d",v[j]);
                        if(j<v.size()-1) printf(" ");
                        else printf("
    ");
                    }
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    LeetCode 12. 整数转罗马数字
    [Python] for in range()使用以及列表字符串反转方法
    组合数问题
    「BJOI2020」封印
    数据结构优化建图
    小Q与找茬
    无旋Treap学习
    jzoj5679
    数星星
    凸性
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5494668.html
Copyright © 2020-2023  润新知