新人首蓝求助,使用了getline,已按照评论区答捞讲的将字符串的最后一个字符删除,经测试输入仍然RE(不是在这个号上测的),代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int n,ew,m;
struct E{
string name;
vector<string> spe;
int sus[N]={0};
int day;
}p[N];
int ord_find(string s)
{
for(int i=1;i<=n;i++)
if(s==p[i].name) return i;
return 0;
}
string name_spa(string e)
{
int w=0;
string r;
while(e[w]!=':') r.push_back(e[w]),w++;
return r;
}
string spe_spa(string r)
{
int fir=0;
while(r[fir]!=':') {fir++;} fir++;
while(r[fir]==' ') {fir++;}
for(int i=1;i<=fir;i++) r.erase(r.begin()+0);
return r;
}
string s_cut(string w,int l,int r)
{
string e;
for(int i=l;i<=r;i++) e.push_back(w[i]);
return e;
}
int p_day(string r)
{
string day[8]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
if(s_cut(r,0,8)!="Today is ") return 0;
string w=s_cut(r,9,(int)r.size()-2);
for(int i=1;i<=7;i++)
if(w==day[i]) return i;
return 0;
}
int p_gui(string r)
{
int fir=0;
while(r[fir]!=' ') {fir++;} fir++;
int sum=0;
if(s_cut(r,fir,(int)r.size()-1)=="am guilty.") sum=-10;
else if(s_cut(r,fir,(int)r.size()-1)=="am not guilty.") sum=-20;
else if(s_cut(r,fir,(int)r.size()-1)=="is guilty.") sum=100;
else if(s_cut(r,fir,(int)r.size()-1)=="is not guilty.") sum=200;
int ord=ord_find(s_cut(r,0,fir-2));
if(sum>0) sum+=ord;
return sum;
}
vector<vector<int> > li;
void dfs(int k=0,vector<int> v={})
{
if((int)v.size()==ew)
{
li.push_back(v);
return ;
}
if(k==n) return ;
for(int i=k+1;i<=n;i++)
{
v.push_back(i);
dfs(i,v);
v.erase(v.end()-1);
}
}
vector<int> __abs(vector<int> r)
{
vector<int> w;
int l=r.size();
for(int i=1;i<=n;i++)
{
int op=0;
for(int j=0;j<l;j++) if(r[j]==i) op=1;
if(op) continue;
w.push_back(i);
}
return w;
}
bool v_com(vector<int> r)
{
if(r.empty()) return true;
int l=r.size();
for(int i=1;i<l;i++)
if(r[i]!=r[0]) return false;
return true;
}
vector<int> diff(vector<int> r)
{
r=__abs(r);
vector<int> e;
int l=r.size();
for(int i=1;i<=n;i++)
{
vector<int> w;
for(int j=0;j<l;j++)
{
if(!p[r[j]].sus[i]) continue;
w.push_back(p[r[j]].sus[i]);
}
if(!v_com(w))
{
e.clear();
return e;
}
if(p[r[0]].sus[i]==1) e.push_back(i);
}
vector<int> w;
for(int i=0;i<l;i++)
{
if(!p[i].day) continue;
w.push_back(p[i].day);
}
if(!v_com(w)) e.clear();
return e;
}
int main()
{
cin>>n>>ew>>m;
for(int i=1;i<=n;i++) cin>>p[i].name;
getchar();
for(int i=1;i<=m;i++)
{
string e;getline(cin,e);
int ord=ord_find(name_spa(e));
p[ord].spe.push_back(spe_spa(e));
}
for(int i=1;i<=n;i++)
{
int l=p[i].spe.size(),r;
for(int j=0;j<l;j++)
{
r=p_day(p[i].spe[j]);p[i].day=r;
r=p_gui(p[i].spe[j]);
if(r==-10) p[i].sus[i]=1;
else if(r==-20) p[i].sus[i]=-1;
else if(r>200) p[i].sus[r%100]=-1;
else if(r>100) p[i].sus[r%100]=1;
}
}
dfs();
int l=li.size();
vector<int> r;
for(int i=0;i<l;i++)
{
r.clear();
r=diff(li[i]);
if(r.size()) break;
}
if(r.size()>1) cout<<"Cannot Determine";
else if(r.size()==0) cout<<"Impossible";
else cout<<p[r[0]].name;
}