如题。测试点 #3 #10 WA。
#include <bits/stdc++.h>
using namespace std;
#define pss pair<string, string>
#define mp make_pair
#define gl getline
#define st first
#define nd second
int m, n, p;
string a[25];
pss b[105];
int check2(int t, string glty, string now, string wd)
{
if (wd == "I am guilty.")
return glty == now;
if (wd == "I am not guilty.")
return glty != now;
for (int i = 1; i <= m; i++)
{
if (wd == (a[i] + " is guilty."))
return a[i] == glty;
}
for (int i = 1; i <= m; i++)
{
if (wd == (a[i] + " is not guilty."))
return a[i] != glty;
}
string days[] = {
"N/A",
"Today is Monday.",
"Today is Tuesday.",
"Today is Wednesday.",
"Today is Thursday.",
"Today is Friday.",
"Today is Saturday.",
"Today is Sunday."
};
for (int i = 1; i <= 7; i++)
{
if (wd == days[i])
return t == i;
}
return -1;
}
bool check(int t, string name)
{
map<string, int> vis;
for (int i = 1; i <= p; i++)
{
pss wd = b[i];
int ck = check2(t, name, wd.st, wd.nd);
if (ck == -1)
continue;
else if (ck == 1)
{
auto it = vis.find(wd.st);
if (it == vis.end())
vis[wd.st] = 1;
else if (vis[wd.st] == 0)
return false;
}
else if (ck == 0)
{
auto it = vis.find(wd.st);
if (it == vis.end())
vis[wd.st] = 0;
else if (vis[wd.st] == 1)
return 0;
}
}
int cnt1, cnt2;
cnt1 = cnt2 = 0;
for (int i = 1; i <= m; i++)
{
if (vis[a[i]] == 0)
cnt1++;
auto it = vis.find(a[i]);
if (it == vis.end())
cnt2++;
}
return ((cnt1 <= n) && ((cnt1 + cnt2) >= n));
}
int main()
{
cin >> m >> n >> p;
for (int i = 1; i <= m; i++)
cin >> a[i];
for (int i = 1; i <= p; i++)
{
string name, word;
cin >> name;
name.erase(name.size() - 1);
gl(cin, word);
word.erase(word.begin());
word.erase(word.end() - 1);
b[i] = mp(name, word);
}
int cnt = 0;
string ans = "";
for (int t = 1; t <= 7; t++)
{
cnt = 0;
for (int i = 1; i <= m; i++)
{
if (check(t, a[i]))
{
cnt++;
ans = a[i];
}
}
if (cnt > 1)
{
cout << "Cannot Determine" << "\n";
return 0;
}
}
if (ans == "")
cout << "Impossible" << "\n";
else
cout << ans << "\n";
return 0;
}
测试点 3 如下:
5 1 5
A
B
C
D
E
A: Today is Monday.
B: Today is Thursday.
C: Today is Monday.
B: D is not guilty.
E: I am not guilty.
D
我的程序对测试点 3 输出 Impossible
。