您的位置:首页 > 其它

ZOJ 3674 - Search in the Wiki

2013-03-30 21:55 513 查看
找各个单词之间的公共tips,用一个数组cnt来计数,cnt[i]值为要查询的单词的数量就是一个common word,最后对答案拍下序

#include <iostream>
#include <map>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
#define MAX 1000
char buf[2048];
map<int,map<int,int> >vs;
map<string,int>sToNum;
map<int,string>numToS;
int n,m;
int main(){

while (scanf("%d",&n)==1)
{
int index=1;
vs.clear();
sToNum.clear(),numToS.clear();
for (int i=0;i<n;++i)
{
scanf("%s\n",buf);
string u=buf;
if(sToNum[u]==0){
sToNum[u]=index;
numToS[index++]=u;
}
gets(buf);
char *str=strtok(buf," ");
while (str)
{
string t=str;
if(sToNum[t]==0){
sToNum[t]=index;
numToS[index++]=t;
}
vs[sToNum[u]][sToNum[t]]=1;
str=strtok(NULL," ");
}
}
scanf("%d\n",&m);
while (m--)
{
int cnt[MAX]={0},count=0;
gets(buf);
char *str=strtok(buf," ");
while (str)
{
++count;
string t=str;
int num=sToNum[t];
map<int,int>::iterator it=vs[num].begin();
for (;it!=vs[num].end();++it)cnt[it->first]++;
str=strtok(NULL," ");
}
vector<string>ans;
for (int i=0;i<index;++i)
{
if(cnt[i]==count)ans.push_back(numToS[i]);
}
if(ans.size()){
sort(ans.begin(),ans.end());
for (int i=0;i<ans.size();++i)
{
if(i>0)printf(" ");
printf("%s",ans[i].c_str());
}
}else printf("NO");
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: