句子结构合法:
主语有1到多个
谓语有且仅有1个
宾语有0到多个
#include <bits/stdc++.h>
using namespace std;
// 三个单词表
unordered_set<string> zhuyu;
unordered_set<string> weiyu;
unordered_set<string> binyu;
bool judge(vector<string> &temp){
// return true;
int i = 0, len = temp.size();
if(len < 2){
// cout<<"长度小于2"<<endl;
return false; // 至少有主谓
}
// 判断主语
for(; i < len; ++i){
if(i == 0 && zhuyu.find(temp[i]) == zhuyu.end()){ // 验证主语存在
// cout<<"主语不存在"<<endl;
return false;
}
if(zhuyu.find(temp[i]) != zhuyu.end()){ // 主语可有多个
continue;
}
break; // 跳到谓语判断
}
//判断谓语
for(; i < len; ++i){
if(weiyu.find(temp[i]) == weiyu.end()){ // 谓语不存在
// cout<<"谓语不存在"<<endl;
return false;
};
i++;
break; // 谓语有一个
}
// 判断宾语
for(; i < len; ++i){
if(weiyu.find(temp[i]) != weiyu.end()){
// cout<<"谓语有多个"<<endl;
return false;
}else continue;
}
return true;
}
void split_string(const string str, vector<string>&vec, const std::string cut) {
std::string::size_type begin_index, end_index;
end_index = str.find(cut);
begin_index = 0;
while(std::string::npos != end_index)
{
vec.push_back(str.substr(begin_index, end_index-begin_index));
begin_index = end_index+ cut.size();
end_index = str.find(cut, begin_index);
}
if(begin_index != str.length()){
vec.push_back(str.substr(begin_index));
}
}
int main(){
int n1, n2, n3;
cin>>n1>>n2>>n3;
for(int i = 0; i < n1; ++i){
string t;
cin>>t;
zhuyu.insert(t);
}
for(int i = 0; i < n2; ++i){
string t;
cin>>t;
weiyu.insert(t);
}
for(int i = 0; i < n3; ++i){
string t;
cin>>t;
binyu.insert(t);
}
int m;
cin>>m;
getchar();
for(int i = 0; i < m; ++i){
vector<string> temp;
string t;
getline(cin, t);
split_string(t, temp, " ");
if(judge(temp)) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
temp.clear();
}
return 0;
}