#include<iostream>
#include<cstdio>
#include<cmath>
#include<climits>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
#define SF scanf
#define PF printf
int n, m, p, len_r_g1, len_r_g2, len_r_day, len_f_day, len_now_g1, len;
bool vis[105];
string re_g1[105], re_g2[105], re_day[105], fa_day[105], now_g1[105], Fal[105];
struct node {
string g1[105], g2[105], day[105];
int leng1, leng2, lenday;
node () {leng1 = leng2 = lenday = 0;}
//g1:他认为的罪犯
//g2:他不认为的罪犯
//day:字面意思
//leng1、leng2、lenday:字面意思
};
map<string, node> mp;
map<string, bool> vis1, Re_g1, Re_g2, Re_day, Fa_day;
string name[25];
bool getday(string s) {
if(s == "Monday." || s == "Tuesday." || s == "Wednesday." || s == "Thursday." || s == "Friday." || s == "Saturday." || s == "Sunday.") return true;
return false;
}
bool check(string s) {
int lens = s.length(), sum = 0;
for(int i = 0; i < lens; i++) {
if(s[i] == ' ') sum++;
}
return sum == 3 || sum == 4;
}
bool Check() {
Re_g1.clear(), Re_g2.clear(), Re_day.clear(), Fa_day.clear();
len_r_g1 = len_r_g2 = len_r_day = len_f_day = 0;
int now_f = 1;
for(int i = 1; i <= m; i++) {
for(int j = 1; j <= mp[name[i]].leng1; j++) {
if(name[i] != Fal[now_f]) {
if(!Re_g1[mp[name[i]].g1[j]]) {
Re_g1[mp[name[i]].g1[j]] = 1;
re_g1[++len_r_g1] = mp[name[i]].g1[j];
}
}
else {
if(!Re_g2[mp[name[i]].g1[j]]) {
Re_g2[mp[name[i]].g1[j]] = 1;
re_g2[++len_r_g2] = mp[name[i]].g1[j];
}
}
}
for(int j = 1; j <= mp[name[i]].leng2; j++) {
if(name[i] != Fal[now_f]) {
if(!Re_g2[mp[name[i]].g2[j]]) {
Re_g2[mp[name[i]].g2[j]] = 1;
re_g2[++len_r_g2] = mp[name[i]].g2[j];
}
}
else {
if(!Re_g1[mp[name[i]].g2[j]]) {
Re_g1[mp[name[i]].g2[j]] = 1;
re_g1[++len_r_g1] = mp[name[i]].g2[j];
}
}
}
for(int j = 1; j <= mp[name[i]].lenday; j++) {
if(name[i] != Fal[now_f]) {
if(!Re_day[mp[name[i]].day[j]]) {
Re_day[mp[name[i]].day[j]] = 1;
re_day[++len_r_day] = mp[name[i]].day[j];
}
}
else {
if(!Fa_day[mp[name[i]].day[j]]) {
Fa_day[mp[name[i]].day[j]] = 1;
fa_day[++len_f_day] = mp[name[i]].day[j];
}
}
}
if(name[i] == Fal[now_f]) now_f++;
}
if(len_r_g1 != 1 || len_r_day > 1) return false;
string guilty = re_g1[1];
for(int i = 1; i <= len_r_g2; i++) {
if(re_g2[i] == guilty) return false;
}
if(len_r_day == 1) {
string Today = re_day[1];
for(int i = 1; i <= len_f_day; i++) {
if(fa_day[i] == Today) return false;
}
}
return true;
}
void dfs(int id, int now, int last) {
if(now == n) {
bool flag = Check();
if(flag) now_g1[++len_now_g1] = re_g1[1];
return;
}
if(id > m) return;
for(int i = last + 1; i <= m; i++) {
if(!vis[i]) {
vis[i] = 1;
Fal[++len] = name[i];
dfs(id + 1, now + 1, i);
len--;
vis[i] = 0;
}
}
}
int main() {
// freopen("detective.in", "r", stdin);
// freopen("detective.out", "w", stdout);
ios :: sync_with_stdio(false);
cin >> m >> n >> p;
for(int i = 1; i <= m; i++) cin >> name[i], vis1[name[i]] = 1;
for(int i = 0; i <= p; i++) {
string a = "", b = "", c = "", d = "", e = "", x;
bool flaga = 0, flagb = 0, flagc = 0, flagd = 0, flage = 0;
getline(cin, x);
if(!check(x)) continue;
int lenx = x.length();
for(int j = 0; j < lenx; j++) {
if(x[j] == ' ') {
if(!flaga) flaga = 1;
else if(!flagb) flagb = 1;
else if(!flagc) flagc = 1;
else if(!flagd) flagd = 1;
else flage = 1;
continue;
}
if(!flaga) a = a + x[j];
else if(!flagb) b = b + x[j];
else if(!flagc) c = c + x[j];
else if(!flagd) d = d + x[j];
else e = e + x[j];
}
for(int j = 1; j <= m; j++) {
if(a == name[j] + ":") {
if(b == "Today" && c == "is" && getday(d)) mp[name[j]].day[++mp[name[j]].lenday] = d;
else if(b == "I" && c == "am" && d == "not") {
if(e == "guilty.") mp[name[j]].g2[++mp[name[j]].leng2] = name[j];
}
else if(b == "I" && c == "am" && d == "guilty.") mp[name[j]].g1[++mp[name[j]].leng1] = name[j];
else if(vis1[b] && c == "is" && d == "not") {
if(e == "guilty.") mp[name[j]].g2[++mp[name[j]].leng2] = b;
}
else if(vis1[b] && c == "is" && d == "guilty.") mp[name[j]].g1[++mp[name[j]].leng1] = b;
}
}
}
dfs(1, 0, 0);
if(len_now_g1 == 0) cout << "Impossible";
else if(len_now_g1 == 1) cout << now_g1[len_now_g1];
else cout << "Cannot Determine";
return 0;
}
/*
4 2 5
MIKE
BOB
ALICE
AMY
MIKE: I am guilty.
MIKE: AMY is guilty.
BOB: I am guilty.
ALICE: MIKE is guilty.
AMY: I am not guilty.
*/
今天考试遇到了这题,赛时代码,拿了50pts。
也许有错误,但这并不是楼主想要知道的。
刚刚交洛谷,WA了第一个点,但本地上运行没错。
个人感觉是输入或者输出有了奇怪的错误。
求助。
洛谷第一个点如下:
input
2 2 4
HELLO
GUILTY
HELLO: What is your name?
GUILTY: I am GUILTY.
GUILTY: Are you guilty?
HELLO: I am not guilty.
output
HELLO