mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
1b4d6396e4
2700-2799
114 lines
2.5 KiB
C++
114 lines
2.5 KiB
C++
#include <iostream>
|
|
#include <cstdio>
|
|
#include <cstdlib>
|
|
#include <cstring>
|
|
#include <algorithm>
|
|
using namespace std;
|
|
#define maxn 101
|
|
struct Term
|
|
{
|
|
int s[maxn];
|
|
char ch[maxn];
|
|
}term[maxn];
|
|
string word[maxn];
|
|
string st;
|
|
int n, m, termnum[maxn];
|
|
bool input()
|
|
{
|
|
int i = 0;
|
|
while (1)
|
|
{
|
|
getline(cin, word[i]);
|
|
if (word[i] == "#")
|
|
return false;
|
|
if (word[i] == "*")
|
|
break;
|
|
i++;
|
|
}
|
|
n = i;
|
|
return true;
|
|
}
|
|
void getterm(string &a, Term &term, int &num)
|
|
{
|
|
int i = 0, j = 0;
|
|
while (i < a.length())
|
|
{
|
|
if (a[i] != '-' && a[i] != '+')
|
|
{
|
|
term.ch[j] = a[i];
|
|
term.s[j] = 1;
|
|
i++;
|
|
j++;
|
|
continue;
|
|
}
|
|
if (a[i] == '-')
|
|
term.s[j] = 0;
|
|
if (a[i] == '+')
|
|
term.s[j] = 2;
|
|
i++;
|
|
term.ch[j] = a[i];
|
|
i++;
|
|
j++;
|
|
}
|
|
num = j;
|
|
}
|
|
void maketerms()
|
|
{
|
|
int temp;
|
|
int i = 0;
|
|
temp = st.find('|');
|
|
while (temp != string::npos)
|
|
{
|
|
string sub = st.substr(0, temp);
|
|
getterm(sub, term[i], termnum[i]);
|
|
st.erase(0, temp + 1);
|
|
i++;
|
|
temp = st.find('|');
|
|
}
|
|
getterm(st, term[i], termnum[i]);
|
|
m = i + 1;
|
|
}
|
|
bool match(string &word, Term &term, int &num)
|
|
{
|
|
for (int i = 0; i < num; i++)
|
|
if (term.s[i] == 0 && word.find(term.ch[i]) != string::npos)
|
|
return false;
|
|
for (int i = 0; i < num; i++)
|
|
if (term.s[i] == 2 && word.find(term.ch[i]) == string::npos)
|
|
return false;
|
|
for (int i = 0; i < num; i++)
|
|
if (term.s[i] == 1 && word.find(term.ch[i]) != string::npos)
|
|
return true;
|
|
return false;
|
|
}
|
|
int main()
|
|
{
|
|
while (1)
|
|
{
|
|
if (!input())
|
|
break;
|
|
sort(word, word + n);
|
|
while (getline(cin, st) && st != "**")
|
|
{
|
|
bool found = false;
|
|
maketerms();
|
|
for (int i = 0; i < n; i++)
|
|
{
|
|
for (int j = 0; j < m; j++)
|
|
if (match(word[i], term[j], termnum[j]))
|
|
{
|
|
found = true;
|
|
cout << word[i] << endl;
|
|
break;
|
|
}
|
|
if (found)
|
|
break;
|
|
}
|
|
if (!found)
|
|
cout << "NONE" << endl;
|
|
}
|
|
cout << "$" << endl;
|
|
}
|
|
return 0;
|
|
}
|