题目大意
思路
如果一个询问只有一个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 }