2012-0069
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
签到题.. 只要按照题目说明模拟就好,数据范围给得很小 ------kotori
{{{
#include<stdio.h>
#include<map>
#include<set>
#include<string>
#include<iostream>
#include<cstring>
using namespace std;
map<string,int>word;
map<string,int>tips;
map<int,string>lword;
map<int,string>ltips;
set<string>output;
string opt;
char re[256];
int n,m,tot;
bool in[128][10246];
bool pick[10246];
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int i,j,k,ans;
while(scanf("%d ",&n)!=EOF){
word.clear();
tips.clear();
lword.clear();
ltips.clear();
memset(in,0,sizeof(in));
for(i=1;i<=n;i++){
gets(re);
word[re]=i,lword[i]=re;
memset(re,0,sizeof(re));
gets(re);
for(j=0;re[j];j++){
opt="";
while(re[j] && re[j]!=' ')
opt=opt+re[j++];
if(tips[opt]==0)
tips[opt]=++tot,ltips[tot]=opt;
in[i][tips[opt]]=true;
}
memset(re,0,sizeof(re));
}
scanf("%d ",&m);
while(m--){
gets(re);
memset(pick,1,sizeof(pick));
output.clear();
for(i=0;re[i];i++){
opt="";
while(re[i] && re[i]!=' ')
opt=opt+re[i++];
k=word[opt];
for(j=1;j<=tot;j++)
if(!in[k][j])
pick[j]=false;
}
for(i=1;i<=tot;i++)
if(pick[i])
output.insert(ltips[i]);
if(!output.empty()){
set<string>::iterator it = output.begin();
cout<<*(it++);
while(it!=output.end())
cout<<" "<<*(it++);
cout<<endl;
}
else
printf("NO\n");
memset(re,0,sizeof(re));
fflush(stdout);
}
}
return 0;
}
}}}
签到题.. 只要按照题目说明模拟就好,数据范围给得很小
kotori
#include<stdio.h>
#include<map>
#include<set>
#include<string>
#include<iostream>
#include<cstring>
using namespace std;
map<string,int>word;
map<string,int>tips;
map<int,string>lword;
map<int,string>ltips;
set<string>output;
string opt;
char re[256];
int n,m,tot;
bool in[128][10246];
bool pick[10246];
int main()
{
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
int i,j,k,ans;
while(scanf("%d ",&n)!=EOF){
word.clear();
tips.clear();
lword.clear();
ltips.clear();
memset(in,0,sizeof(in));
for(i=1;i<=n;i++){
gets(re);
word[re]=i,lword[i]=re;
memset(re,0,sizeof(re));
gets(re);
for(j=0;re[j];j++){
opt="";
while(re[j] && re[j]!=' ')
opt=opt+re[j++];
if(tips[opt]==0)
tips[opt]=++tot,ltips[tot]=opt;
in[i][tips[opt]]=true;
}
memset(re,0,sizeof(re));
}
scanf("%d ",&m);
while(m--){
gets(re);
memset(pick,1,sizeof(pick));
output.clear();
for(i=0;re[i];i++){
opt="";
while(re[i] && re[i]!=' ')
opt=opt+re[i++];
k=word[opt];
for(j=1;j<=tot;j++)
if(!in[k][j])
pick[j]=false;
}
for(i=1;i<=tot;i++)
if(pick[i])
output.insert(ltips[i]);
if(!output.empty()){
set<string>::iterator it = output.begin();
cout<<*(it++);
while(it!=output.end())
cout<<" "<<*(it++);
cout<<endl;
}
else
printf("NO\n");
memset(re,0,sizeof(re));
fflush(stdout);
}
}
return 0;
}