题意:给你一些英语单词和这些单词翻译成其他语言时的单词,在后面给你一些其他语言的单词,看能否用字典来翻译。
思路: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;
}