题意:给你一些英语单词和这些单词翻译成其他语言时的单词,在后面给你一些其他语言的单词,看能否用字典来翻译。
思路:hash表,字典树,排序。。
我的第一个蹩脚的hash~~~~
AC代码:
#include<cstdio> #include<string.h> #include<iostream> #include<string> #define N 100005 using namespace std; int head[N]; typedef struct str { char s[11]; char s1[11]; int next; }Node; Node node[N]; void add(char *s,char *s1,int t) { int m=1; for(int i=0;i<strlen(s);++i) m=(m*s[i])%N; strcpy(node[t].s,s); strcpy(node[t].s1,s1); node[t].next=head[m]; head[m]=t; } char* Quary(char *s) { int m=1; for(int i=0;i<strlen(s);++i) m=(m*s[i])%N; for(int i=head[m];i!=-1;i=node[i].next) if(!strcmp(s,node[i].s)) return node[i].s1; return "eh"; } int main() { char a[25],b[11],c[11]; int num=0; memset(head,-1,sizeof(head)); while(gets(a)&&strcmp(a,""))//""和" "不一样。。。。。 { num++; int i; for( i=0;i<strlen(a);++i) if(a[i]==' ') {a[i]='\0';break;} strcpy(b,a); strcpy(c,a+(i+1)); add(c,b,num); } while(~scanf("%s",b)) printf("%s\n",Quary(b)); return 0; }
qsort+二分
#include<iostream> #include<string.h> #include<cstdio> #include<stdlib.h> #define N 100005 using namespace std; typedef struct str { char s[11]; char s1[11]; }Node; Node node[N]; int cmp1(const void *a,const void *b) {return strcmp(((Node*)a)->s,((Node*)b)->s);} int cmp(const void *a,const void *b) {return strcmp((char*)a,((Node*)b)->s);} int main() { char a[25]; char b[11],c[11]; int num=0; while(gets(a)&&strcmp(a,"")) { int n=strlen(a),i; for( i=0;i<n;++i) if(a[i]==' ') {a[i]='\0';break;} strcpy(node[num].s1,a); strcpy(node[num++].s,a+(i+1)); } qsort(node,num,sizeof(Node),cmp1); while(~scanf("%s",a)) { Node *p=(Node*)bsearch(a,node,num,sizeof(Node),cmp); if(p) printf("%s\n",p->s1); else printf("eh\n"); }return 0; }
数组模拟字典树~~~~
#include<iostream> #include<string.h> #include<cstdio> #include<stdlib.h> #define N 100005 using namespace std; typedef struct str { int id; int next[26]; }Node; Node node[4*N]; char ss[N][11]; int num=2; void add(int j,char* s) { int i=0,h=1;//h表示根,,,, while(1) { int m=s[i]-'a'; if(node[h].next[m]==0) node[h].next[m]=num++; h=node[h].next[m]; if(s[++i]=='\0') {node[h].id=j;return;} } } int Quary(char *s) { int h=1; int n=strlen(s); for(int i=0;i<n;++i) { int m=s[i]-'a'; if(node[h].next[m]==0) return -1; else h=node[h].next[m]; } return node[h].id; } int main() { char a[25],b[11]; int j=1; while(gets(a)&&strcmp(a,"")) { int n=strlen(a),i; for( i=0;i<n;++i) if(a[i]==' '){a[i]='\0';break;} strcpy(ss[j],a); strcpy(b,a+(i+1)); add(j++,b); } while(~scanf("%s",a)) { int k=Quary(a); if(k==-1) printf("eh\n"); else printf("%s\n",ss[k]); }return 0; }