简单字符串处理 hdu2532 Engine
本来可以把这篇文章放入上一篇文章里,不过做这个题花了一点时间,也有一点收获,同时觉得网上的这个题目可供参考的文章有些少,那么就单独成篇吧。
首先分析下题目思路:
这个题目是个模拟题,步骤也很清晰。
首先需要每行读入,将论文的名字,序号,与被引数放到一个结构体里,同时需要一步处理:将文章名称分为关键字存储。
然后程序进行一次排序,以被引数为第一关键字,以号数为第二关键字排序。
排序之后,按照类似方式读入查询命令,将查询命令分为不同关键字,将这些关键字挨着与论文关键字比较,相同即可输出。
按照这些步骤就可以写出靠谱的代码了,结果我还是wa了三次。。
先上代码,收获就放后面,可忽略。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct record
{
int num;
int count;
int keyL;
char name[];
char afname[];
char key[][];
}Record;
Record rec[];
Record qy;
int divide(char a[],char b[][],int n)
{
int cur=,j=;
for(int i=;i<n;i++)
{
if(a[i]==' ')
{cur++;j=;}
else
b[cur][j++]=a[i];
}
return cur+;
}
int cmp(const void *a,const void *b)
{
Record c = *(Record *)a;
Record d = *(Record *)b;
if(c.count==d.count)
return c.num - d.num;
else return d.count - c.count;//优先按coun排序,大的在前
} int match(char qry[][],char tar[][],int qn,int tn)
{
int num=;
for(int x=;x<qn;x++)
{
for(int y=;y<tn;y++)
if(strcmp(qry[x],tar[y])==)
{
num++;
break;
}
}
if(num==qn)
return ;
else
return ;
} void init(char a[],int n,char b[])
{
for(int ii=;ii<n;ii++)
{
if(a[ii]<='Z'&&a[ii]>='A')
{
b[ii]=char(a[ii]+);
}
else
b[ii]=a[ii];
} }
int main()
{
int T,i;
while(scanf("%d",&T))
{
if(T==)break;
memset(rec,,sizeof(Record)*T);
getchar();
for(i=;i<T;i++)
{
gets(rec[i].name);
init(rec[i].name,strlen(rec[i].name),rec[i].afname);
scanf("%d",&rec[i].count);
getchar();
rec[i].keyL=divide(rec[i].afname,rec[i].key,strlen(rec[i].name));
rec[i].num=i+;
}
qsort(rec,T,sizeof(Record),cmp);
int k;
scanf("%d",&k);getchar();
for(i=;i<k;i++)
{
memset(&qy,,sizeof(Record));
gets(qy.name);
init(qy.name,strlen(qy.name),qy.afname);
qy.keyL=divide(qy.afname,qy.key,strlen(qy.name));
for(int j=;j<T;j++)
{
if(match(qy.key,rec[j].key,qy.keyL,rec[j].keyL))
{
puts(rec[j].name);
}
}
printf("***\n");
}
printf("---\n");
}
return ;
}
hdu 2532
代码方面这是第一次全用C写的结构体+重载比较函数构成的多关键字排序,(之前常用C++),
第一次碰到读入一行的问题,解决方法是在用scanf读入之后,要用getchar+gets配合,
第一次处理memset多组初始化问题memset(rec,0,sizeof(Record)*T);+memset(&qy,0,sizeof(Record));配合使用。
其他的一些辅助函数用来模拟的就不值一提了。
非代码方面,这题大体思路昨晚已经有了,但wa了两次,在不知道错误原因的情况下担心wa之后是TLE,所以当时有点心灰意冷,其实最近也一直很忐忑,面试的通知一直没下来,今天妹妹升学宴又出去一天,可晚上回来没想到只用了半小时就调了两个bug出来,而且A了这个少有人问津的题目。虽然心中依然忐忑,依然对未知的错误充满恐惧,但是我相信会好起来的。
---一个事情,自己找不到原因,非常可怕。
简单字符串处理 hdu2532 Engine的更多相关文章
- CF 208A Dubstep(简单字符串处理)
题目链接: 传送门 Dubstep Time Limit: 1000MS Memory Limit: 32768 KB Description Vasya works as a DJ in t ...
- 第一部分之简单字符串SDS(第二章)
一,什么是SDS? 1.引出SDSC字符串:c语言中,用空字符结尾的字符数组表示字符串简单动态字符串(SDS):Redis中,用SDS来表示字符串.在Redis中,包含字符串值的键值对在底层都是由SD ...
- hdu 5059 简单字符串处理
http://acm.hdu.edu.cn/showproblem.php?pid=5059 确定输入的数是否在(a,b)内 简单字符串处理 #include <cstdio> #incl ...
- C 封装一个通用链表 和 一个简单字符串开发库
引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是 ...
- 1442: Neo 的简单字符串(字符串)
1442: Neo 的简单字符串 时间限制: 10 Sec 内存限制: 128 MB 提交: 9 解决: 3 统计 题目描述 Neo 给你一系列字符串,请你输出字符串中的不同单词个数以及总单词个数. ...
- Java实验--关于简单字符串回文的递归判断实验
首先题目要求写的是递归的实验,一开始没注意要求,写了非递归的方法.浪费了一些时间,所谓吃一堑长一智.我学习到了以后看实验的时候要认真看实验中的要求,防止再看错. 以下是对此次的实验进行的分析: 1)递 ...
- python 简单字符串字典加密
1 def crypt(source,key): from itertools import cycle result='' temp=cycle(key) for ch in source: res ...
- 洛谷 简单字符串 'P1055ISBN号码' 问题
题目描述如下: 知识点①:char数组与int型数字进行运算时,需要将 char[i]-'0' .比如 char c[5]; int i; for(i=0;i<5;i++) scanf(&quo ...
- c# 进程间的通信实现之一简单字符串收发
使用Windows API实现两个进程间(含窗体)的通信在Windows下的两个进程之间通信通常有多种实现方式,在.NET中,有如命名管道.消息队列.共享内存等实现方式,这篇文章要讲的是使用Wi ...
随机推荐
- jdbc操作步骤和preparedStatment相比Statment的好处
java操纵数据库封装了一组API,通过这组API可以透明的操作各种数据库,一般来讲,操纵数据库的步骤是: 一. try{ 1.加载数据库驱动 Class.forName("数据库驱动类&q ...
- 编译和安装shibboleth-sp遇到的问题
In file included from mod_shib_20.cpp:68: mod_shib.cpp:118: warning: deprecated conversion from stri ...
- Unity的NGUI插件篇——入场效果
Unity的NGUI插件篇--入场效果 入场效果 入场效果须要借助于NGUI提供的TweenPosition类来完毕.为了说明此类的用法.本节将使会解说两个演示样例.本文选自 大学霸 <NGU ...
- LKD3
第三章 进程1. Unix操作系统的抽象:进程和文件2. 进程包括两个因素:可运行代码,和资源(打开的文件,挂起的信号,内核内部数据,处理器状态,地址空间)3. 线程是进程中活动的对象.4. 线程有独 ...
- Oracle存储包存储及案例
Package左侧文件: create or replace package S02_ZFRZPT_YS_MID is procedure start_cal(strgranularity in va ...
- 如何通过java反射将数据库表生成实体类?
首先有几点声明: 1.代码是在别人的基础进行改写的: 2.大家有什么改进的意见可以告诉我,也可以自己改好共享给其他人: 3.刚刚毕业,水平有限,肯定有许多不足之处: 4.希望刚刚学习java的同学能有 ...
- gets函数完美替代
当我们在使用gets函数时候,因为不确定gets函数的buffer究竟有多大,所以这个函数只能用作是玩具函数.因此,当我们需要直接从输入得到一个东西的时候可以用fgets函数代替gets函数,这样不管 ...
- PHP数组与对象之间用递归转换
2 3 4 5 6 7 8 function object_to_array($e) { $_arr = is_object($e) ? get_object_vars($e) : $e; ...
- Kettle之数据抽取、转换、装载
Kettle 官网 ETL利器Kettle实战应用解析系列 利用kettle组件导入excel文件到数据库 kettle中实现动态SQL查询 java中调用kettle转换文件
- 自定义类StyleSheet跨浏览器操作样式表中的规则
这是群里网友地瓜提供的一个类,不熟悉样式表对象和样式规则对象的浏览器差异的可以看看 /** * Stylesheet.js: utility methods for scripting CSS sty ...