PAT Digital Library

题目大意

problem

思路

如果一个询问只有一个ID,用map就好。

而现在一个询问有多个ID,可以考虑每个map后都加个链表,类似于图的邻接链表储存或hash处理冲突的方式。

!!!!!注意ID是允许前导零的!!!!!

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<string,int> head[6];
 4 int bokc,ans[10004],n,m,anc;
 5 struct node
 6 {
 7     int id,next;
 8 }book[1000005];
 9 string s0;
10 string readl()
11 {
12     string ret=s0;
13     char ch=getchar();
14     while(ch=='\n')ch=getchar();
15     while(ch!=-1&&ch!='\n')
16     {
17         ret+=ch;
18         ch=getchar();
19     }
20     return ret;
21 }
22 void addbok(string ss,int id,int x)
23 {
24     bokc++;
25     book[bokc].id=id;
26     book[bokc].next=head[x][ss];
27     head[x][ss]=bokc;
28 }
29 void kwords(int hh)
30 {
31     string bok=s0;
32     char ch=getchar();
33     while(ch!=-1&&ch!='\n')
34     {
35         bok=s0;
36         if(ch==' ')ch=getchar();
37         while(ch!=' '&&ch!='\n'&&ch!=-1)
38         {
39             bok+=ch;
40             ch=getchar();
41         }
42         addbok(bok,hh,3);
43     }    
44 }
45 
46 void printt(int x)
47 {
48     int k=1000000;
49     for(int i=1;i<=7;i++)
50     {
51         printf("%d",x/k);
52         x%=k;
53         k/=10;
54     }
55     printf("\n");
56 }
57 int main()
58 {
59     scanf("%d",&n);
60     for(int i=1;i<=n;i++)
61     {
62         int id;
63         string bok1,bok2,bok4,bok5;
64         scanf("%d",&id);
65         bok1=readl();addbok(bok1,id,1);
66         bok2=readl();addbok(bok2,id,2);
67         kwords(id);
68         bok4=readl();addbok(bok4,id,4);
69         bok5=readl();addbok(bok5,id,5);
70     }
71     scanf("%d",&m);
72     for(int i=1;i<=m;i++)
73     {
74         string s=readl(),xs=s0;
75         cout<<s<<endl;
76         anc=0;
77         memset(ans,0,sizeof(ans));
78         int l=s.length();
79         for(int j=3;j<l;j++)xs+=s[j];
80         int cas=s[0]-'0';
81         int tem=head[cas][xs];
82         while(tem)
83         {
84             anc++;
85             ans[anc]=book[tem].id;
86             tem=book[tem].next;
87         }
88         if(anc==0)printf("Not Found\n");
89         else
90         {
91             sort(ans+1,ans+1+anc);
92             printt(ans[1]);
93             for(int j=2;j<=anc;j++)if(ans[j]!=ans[j-1])printt(ans[j]);
94         }
95     }
96     return 0;
97 } 

 

转载于:https://www.cnblogs.com/LiqgNonqfu/p/10322396.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值