KSS的金牌梦1
总提交 : 76 测试通过 : 11
比赛描述
KSS是nupt集训队里公认的最具有金牌实力的选手,熟练掌握多种金牌算法,但是由于队友水平太菜和自身情绪不稳定,一直没能拿到金牌。KSS为了圆梦,想为自己制定一个训练计划,那么问题来了:
ACM中有许多算法之间是有单方面依赖关系的,比如:想学会A,就必须先学B,由于KSS很聪明,所以它可以学完A再学B;当然也存在两种或多种算法相互交融的情况,比如:想学会A,就必须先学B,想学会B,就必须先学A,这种情况KSS就不知从何下手了。
现在给出KSS打算学习的一些算法之间的依赖关系,KSS将尽自己最大的努力去学习这些算法。再给出比赛会出现的算法,如果KSS能学会超过70%的比赛算法,他就能圆梦,否则,他只能含恨退役。
输入
多组测试用例。
第一行一个整数N(0<=N<=250000)表示有N对算法间存在依赖关系,保证涉及的算法总数不超过500
接下来N行每行有两个字符串(以空格分割),表示前一个算法依赖后一个算法,第N+1行有一个整数M(0<M<=1000)表示比赛会出现M个算法,接下来M行每行有一个字符串表示比赛出现的算法。(字符串保证不含空格)
输出
如果KSS可以圆梦,输出“Excelsior!”,否则,输出“KSS have a dream!”。(不用输出引号)
样例输入
4
Aho-Corasickautomaton KMP
Aho-Corasickautomaton trietree
Inclusion-ExclusionPrinciple Mobiusinversion
Mobiusinversion Inclusion-ExclusionPrinciple
5
KMP
trietree
Aho-Corasickautomaton
Splay
Suffixarray
样例输出
KSS have a dream!
提示
对于样例,KSS可以学会KMP、trietree、Aho-Corasickautomaton,但是并不能学会Inclusion-ExclusionPrinciple、Mobiusinversion,所以只能掌握60%的比赛算法
题目来源
hjp
#include<iostream>
#include<string>
#include<map>
#include<queue>
#define MAX_M 1001
using namespace std;
int N; //依赖的个数
int stringNo; //总共的算法个数
map<string,int> nameToIndex; //算法名转换为数组下标
vector<int> nexts[MAX_M]; //第i个算法的后继节点们,即学他们之前必须先学i
int preNum[MAX_M]; //第i个算法的前驱个数
void init(){
stringNo = 0;
nameToIndex.clear();
for(int i=0; i<MAX_M; i++){
nexts[i].clear();
preNum[i] = 0;
}
}
void addDepend(){
int i,j;
string s1,s2;
while(N--){
cin>>s1>>s2;
if(nameToIndex.count(s1)){
i = nameToIndex[s1];
}else{
i = stringNo++;
nameToIndex[s1] = i;
// cout<<i<<'\t'<<s1<<endl;
}
if(nameToIndex.count(s2)){
j = nameToIndex[s2];
}else{
j = stringNo++;
nameToIndex[s2] = j;
// cout<<j<<'\t'<<s2<<endl;
}
nexts[j].push_back(i);
preNum[i]++;
}
}
void topSort(){
bool flag = 1;
int i,j,len,k;
while(flag){
flag = 0;
for(i=0;i<stringNo;i++){
if(0==preNum[i] && !nexts[i].empty()){
len = (int)nexts[i].size();
for(j=0; j<len; j++){
k = nexts[i][j];
preNum[k]--;
if(0==preNum[k]){
flag = 1;
}
}
}
nexts[i].clear();
}
}
}
void printResult(){
int M,i,num=0;
string s;
cin>>M;
for(i=0;i<M;i++){
cin>>s;
if(nameToIndex.count(s) && 0 == preNum[ nameToIndex[s] ] ){
num++;
// cout<<s<<"\tOK"<<endl;
}else{
// cout<<s<<"\tcan't learn"<<endl;
}
}
if(num*10 > M*7){
cout<<"Excelsior!"<<endl;
}else{
cout<<"KSS have a dream!"<<endl;
}
}
int main(){
// freopen("text.txt","r",stdin);
while(cin>>N){
init();
addDepend();
topSort();
printResult();
}
}