简单模拟题,耐心写就能过。
#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; }