2016"百度之星" - 资格赛(Astar Round1) Problem E

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

#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\n");
            else
            {
                for(int j=0; j<v.size(); j++)
                {
                    printf("%d",v[j]);
                    if(j<v.size()-1) printf(" ");
                    else printf("\n");
                }
            }
        }
    }
    return 0;
}

 

posted @ 2016-05-15 10:00  Fighting_Heart  阅读(151)  评论(0编辑  收藏  举报