博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2503 字符串(两种方法)
阅读量:6155 次
发布时间:2019-06-21

本文共 2942 字,大约阅读时间需要 9 分钟。

   方法一:

          qsort+二分查找。先对字典根据外语来进行qsort.然后通过二分查找即可找到匹配的项。这里用到两个函数sscanf()和bsearch();

#include 
#include
#include
using namespace std; char str1[11],str2[11]; char str[25]; struct dict{
char en[11]; char fn[11]; }a[100005]; int q_cmp(const void*a,const void*b) {
return strcmp(((dict*)a)->fn,((dict*)b)->fn); } int b_cmp(const void *a,const void *b) {
return strcmp((char*)a,((dict*)b)->fn); } int main() {
freopen("acm.txt","r",stdin); int i=0; int sign=1; dict *p; while(gets(str)) {
if(str[0]=='\0') {
sign=0; qsort(a,i,sizeof(dict),q_cmp); continue; } if(sign) { sscanf(str,"%s %s",a[i].en,a[i].fn); i++; } else {
p=(dict*)bsearch(str,a,i,sizeof(dict),b_cmp); if(p) {
puts(p->en); } else {
puts("eh"); } } } return 0; }

方法二: 通过ELFhash函数来做。冲突处理则是用到链表的方法。也不难。

#include 
#include
#include
#define N 100001 #define strSize 15 using namespace std; struct hash{
bool used; char fn[strSize],en[strSize]; hash* next; //用于冲突时构造链表 hash(){used=false; next=NULL;} hash(char *f,char *e) {
strcpy(fn,f); strcpy(en,e); used=false; next=NULL; } }h[N]; int ELFhash(char *key){
unsigned long h=0; unsigned long x=0; while(*key) {
h=(h<<4)+(*key++); //h左移4位,当前字符ASCII存入h的低四位 if( (x=h & 0xF0000000L)!=0) { //如果最高位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出 //因此要有如下处理 h^=(x>>24); //清空28~31位 h&=~x; } } return h % N; } int main() {
freopen("acm.txt","r",stdin); char str[30],en[strSize],fn[strSize]; hash* p; int sign=1,key; while(gets(str)) {
if(str[0]=='\0') {
sign=0; continue; } if(sign) //输入字典 {
sscanf(str,"%s %s",&en,&fn); key=ELFhash(fn); //获取hash值 if(!h[key].used) //对应到hash表中 {
h[key].used=true; strcpy(h[key].en,en); strcpy(h[key].fn,fn); } else //处理冲突 {
p=&h[key]; while(p->next != NULL) p=p->next; p->next=new hash(fn,en); } } else //输入外文 {
key=ELFhash(str); if(!h[key].used) printf("eh\n"); else {
p=&h[key]; while(p!=NULL) {
if(!strcmp(str,p->fn)) {
printf("%s\n",p->en); break; } else {
p=p->next; } } if(p==NULL) printf("eh\n"); //不匹配的情况,不能少 } } } return 0; }

 

 

转载地址:http://lpbfa.baihongyu.com/

你可能感兴趣的文章
发现一个叫阿尔法城的小站(以后此贴为我记录日常常用网址的帖子了)
查看>>
Subversion使用Redmine帐户验证简单应用、高级应用以及优化
查看>>
Javascript Ajax 异步请求
查看>>
DBCP连接池
查看>>
cannot run programing "db2"
查看>>
mysql做主从relay-log问题
查看>>
Docker镜像与容器命令
查看>>
批量删除oracle中以相同类型字母开头的表
查看>>
Java基础学习总结(4)——对象转型
查看>>
BZOJ3239Discrete Logging——BSGS
查看>>
SpringMVC权限管理
查看>>
spring 整合 redis 配置
查看>>
redhat6.1下chrome的安装
查看>>
cacti分组发飞信模块开发
查看>>
浅析LUA中游戏脚本语言之魔兽世界
查看>>
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
类与成员变量,成员方法的测试
查看>>
活在当下
查看>>