题意:有
n
n
n个用户,每个用户有一个
d
n
dn
dn和
n
u
m
num
num个属性。用户属性有
n
u
m
num
num个,每个用户具有这些属性中若干个,一些属性可能有也可能没有,每个属性有一个值。现在给定
m
m
m个匹配表达式,表达式有以下运算:
1.
a
:
b
a:b
a:b表示属性a的值为b
2.
a
b
a~b
a b表示属性a的值不为b
3.
∣
|
∣表示或,两个表达式有一个可以找到匹配的用户即成立
4.KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲表示与,两个表达式都要可以找到匹配的用户即成立
找出并输出每一个匹配表达式相匹配的用户的 DN值。
#include<bits/stdc++.h>
using namespace std;
int n,m,Dn,num,id,v;
struct User
{
int dn;
unordered_map<long,long> attr;
}user[2510];
vector<int> yuanzi(string s)//找原子公式
{
vector<int> t;
if(s.find(":")!=-1)
{
int res=s.find(":");//找到:位置
auto id=s.substr(0,res);//:左边数字
auto v=s.substr(res+1,s.size()-res-1);//:右边数字
int Id=stoi(id);int V=stoi(v);//将str转换为int
for(int i=0;i<n;i++)
{
if(user[i].attr.count(Id))
if(user[i].attr[Id]==V)//找到匹配的dn号
t.push_back(user[i].dn);
}
sort(t.begin(),t.end());//dn号从大到小
}
else if(s.find('~')!=-1)
{
int res=s.find("~");
auto id=s.substr(0,res);
auto v=s.substr(res+1,s.size()-res-1);
int Id=stoi(id);int V=stoi(v);
for(int i=0;i<n;i++)
{
if(user[i].attr.count(Id))
if(user[i].attr[Id]!=V)
t.push_back(user[i].dn);
}
sort(t.begin(),t.end());
}
return t;
}
vector<int> qiantao(string s)
{
vector<int> t;
if(s[0]>'0'&&s[0]<='9')//如果无括号就转换为原子式
return yuanzi(s);
else
{
char c=s[0];
s.erase(0,1);
int len=s.size();
int res=-1;
for(int i=1;i<=len;i++)
{
string str=s.substr(0,i);//当左右括号匹配时,是一个式子
if(count(str.begin(),str.end(),'(')==count(str.begin(),str.end(),')'))
{res=i;break;}
}
string ls;
string rs;
if(res-2>=0)
{
ls=s.substr(1,res-2);//左边括号中的字串
rs=s.substr(res+1,s.size()-res-2); //右边括号中的字串
}
vector<int> l=qiantao(ls);
vector<int> r=qiantao(rs);
if(c=='&')
{
vector <int> temp;
set_intersection(l.begin(),l.end(),r.begin(),r.end(),back_inserter(temp));
return temp;
}
else if(c=='|')
{
vector <int> temp;
set_union(l.begin(),l.end(),r.begin(),r.end(),back_inserter(temp));
return temp;
}
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d%d",&Dn,&num);
user[i].dn=Dn;
for(int j=1;j<=num;j++)
{
cin>>id>>v;
user[i].attr[id]=v;
}
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
string str;
cin>>str;
vector<int> answer;
answer=qiantao(str);
sort(answer.begin(),answer.end());
if(answer.size()==0)cout<<endl;
else
{
for(auto i:answer)cout<<i<<" ";
cout<<endl;
}
}
return 0;
}