感觉第三题好多都是这种多次查询的,不知道是不是时间卡的很水(刚好卡12秒以内过了)
总体思路就是递归,当然也要学好stl
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
map<int, map<int,vector<int>>> mp;
map<int,vector<int>> mp1;
int main() {
int n;
cin >> n;
vector<int> complicatedcal(string str);
for (int i = 0; i < n; i++) {
int dn;
int num;
cin >> dn >> num;
for(int j=0;j<num;j++){
int position;
int value;
cin>>position;
cin>>value;
mp[position][value].push_back(dn);
mp1[position].push_back(dn);
}
}
int ordernum;
cin >> ordernum;
string orders;
vector<int> autocal(string str);
for (int i = 0; i < ordernum; i++) {
cin >> orders;
vector<int>res=complicatedcal(orders);
set<int> s;
s.insert(res.begin(),res.end());
res.clear();
res.assign(s.begin(),s.end());
std::sort(res.begin(), res.end());
for(auto it:res){
cout<<it<<" ";
}
cout<<endl;
}
return 0;
}
vector<int> autocal(string str){
int i=0;
while(str[i]<='9'&&str[i]>='0'){
i++;
}
vector<int> res;
int temp1= stoi(str.substr(0,i));
int temp2=stoi(str.substr(i+1,str.size()-i-1));
if(str[i]==':'){
res=mp[temp1][temp2];
}
else{
res=mp1[temp1];
for(auto item:mp[temp1][temp2]){
res.erase(std::remove(res.begin(), res.end(),item));
}
}
return res;
}
vector<int> complicatedcal(string str){
vector<int> res;
if(str[0]<='9'&&str[0]>='0'){
res=autocal(str);
return res;
}
int index1=0;
int index2=0;
int index3=0;
int index4=0;
int index=0;
int flag=0;
int flag1=0;
for(int i=0;i<str.size();i++){
if(index==0&&str[i]=='('){
if(flag==0)
{
index1=i;
flag++;
}
else
index3=i;
}
if(str[i]=='('){
index--;
}
if(index==-1&&str[i]==')'){
if(flag1==0)
{
index2=i;
flag1++;
}
else
index4=i;
}
if(str[i]==')'){
index++;
}
}
vector<int> temp1= complicatedcal(str.substr(index1+1,index2-index1-1));
vector<int> temp2= complicatedcal(str.substr(index3+1,index4-index3-1));
if(str[0]=='&'){
vector<int> v;
for(auto it:temp1){
for(auto it1:temp2){
if(it==it1){
v.push_back(it);
}
}
}
return v;
}
else if(str[0]=='|'){
set<int> v1;
vector<int> v;
for(auto it:temp1){
v1.insert(it);
}
for(auto it:temp2){
v1.insert(it);
}
for(auto it:v1){
v.push_back(it);
}
return v;
}
set<int> s;
s.insert(res.begin(),res.end());
res.clear();
res.assign(s.begin(),s.end());
return res;
}