http://poj.org/problem?id=2503&&hash

52 篇文章 0 订阅
43 篇文章 0 订阅

题意:给你一些英语单词和这些单词翻译成其他语言时的单词,在后面给你一些其他语言的单词,看能否用字典来翻译。

思路: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;
}






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值