简单字符串处理 hdu2532 Engine
2013-08-26 20:57
274 查看
本来可以把这篇文章放入上一篇文章里,不过做这个题花了一点时间,也有一点收获,同时觉得网上的这个题目可供参考的文章有些少,那么就单独成篇吧。
首先分析下题目思路:
这个题目是个模拟题,步骤也很清晰。
首先需要每行读入,将论文的名字,序号,与被引数放到一个结构体里,同时需要一步处理:将文章名称分为关键字存储。
然后程序进行一次排序,以被引数为第一关键字,以号数为第二关键字排序。
排序之后,按照类似方式读入查询命令,将查询命令分为不同关键字,将这些关键字挨着与论文关键字比较,相同即可输出。
按照这些步骤就可以写出靠谱的代码了,结果我还是wa了三次。。
先上代码,收获就放后面,可忽略。。
hdu 2532
代码方面这是第一次全用C写的结构体+重载比较函数构成的多关键字排序,(之前常用C++),
第一次碰到读入一行的问题,解决方法是在用scanf读入之后,要用getchar+gets配合,
第一次处理memset多组初始化问题memset(rec,0,sizeof(Record)*T);+memset(&qy,0,sizeof(Record));配合使用。
其他的一些辅助函数用来模拟的就不值一提了。
非代码方面,这题大体思路昨晚已经有了,但wa了两次,在不知道错误原因的情况下担心wa之后是TLE,所以当时有点心灰意冷,其实最近也一直很忐忑,面试的通知一直没下来,今天妹妹升学宴又出去一天,可晚上回来没想到只用了半小时就调了两个bug出来,而且A了这个少有人问津的题目。虽然心中依然忐忑,依然对未知的错误充满恐惧,但是我相信会好起来的。
---一个事情,自己找不到原因,非常可怕。
首先分析下题目思路:
这个题目是个模拟题,步骤也很清晰。
首先需要每行读入,将论文的名字,序号,与被引数放到一个结构体里,同时需要一步处理:将文章名称分为关键字存储。
然后程序进行一次排序,以被引数为第一关键字,以号数为第二关键字排序。
排序之后,按照类似方式读入查询命令,将查询命令分为不同关键字,将这些关键字挨着与论文关键字比较,相同即可输出。
按照这些步骤就可以写出靠谱的代码了,结果我还是wa了三次。。
先上代码,收获就放后面,可忽略。。
#include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct record { int num; int count; int keyL; char name[300]; char afname[300]; char key[11][21]; }Record; Record rec[1001]; Record qy; int divide(char a[],char b[11][21],int n) { int cur=0,j=0; for(int i=0;i<n;i++) { if(a[i]==' ') {cur++;j=0;} else b[cur][j++]=a[i]; } return cur+1; } 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[11][21],char tar[11][21],int qn,int tn) { int num=0; for(int x=0;x<qn;x++) { for(int y=0;y<tn;y++) if(strcmp(qry[x],tar[y])==0) { num++; break; } } if(num==qn) return 1; else return 0; } void init(char a[],int n,char b[]) { for(int ii=0;ii<n;ii++) { if(a[ii]<='Z'&&a[ii]>='A') { b[ii]=char(a[ii]+32); } else b[ii]=a[ii]; } } int main() { int T,i; while(scanf("%d",&T)) { if(T==0)break; memset(rec,0,sizeof(Record)*T); getchar(); for(i=0;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+1; } qsort(rec,T,sizeof(Record),cmp); int k; scanf("%d",&k);getchar(); for(i=0;i<k;i++) { memset(&qy,0,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=0;j<T;j++) { if(match(qy.key,rec[j].key,qy.keyL,rec[j].keyL)) { puts(rec[j].name); } } printf("***\n"); } printf("---\n"); } return 0; }
hdu 2532
代码方面这是第一次全用C写的结构体+重载比较函数构成的多关键字排序,(之前常用C++),
第一次碰到读入一行的问题,解决方法是在用scanf读入之后,要用getchar+gets配合,
第一次处理memset多组初始化问题memset(rec,0,sizeof(Record)*T);+memset(&qy,0,sizeof(Record));配合使用。
其他的一些辅助函数用来模拟的就不值一提了。
非代码方面,这题大体思路昨晚已经有了,但wa了两次,在不知道错误原因的情况下担心wa之后是TLE,所以当时有点心灰意冷,其实最近也一直很忐忑,面试的通知一直没下来,今天妹妹升学宴又出去一天,可晚上回来没想到只用了半小时就调了两个bug出来,而且A了这个少有人问津的题目。虽然心中依然忐忑,依然对未知的错误充满恐惧,但是我相信会好起来的。
---一个事情,自己找不到原因,非常可怕。
相关文章推荐
- hdu 2532 Engine 模拟好题 字符串的处理
- hdu 1062 Text Reverse(字符串处理,简单模拟)
- hdu 5059 简单字符串处理
- hdu 5059 简单字符串处理
- HDU 1073 Online Judge (字符串处理,简单题)
- 简单字符串处理 hdu1062 Text Reverse
- hdu 1004 Let the Balloon Rise ( 字符串简单处理)
- hdu 2734 简单地字符串处理
- hdu 3787 A+B(简单字符串处理)
- HDU 2895 字符串处理(看懂就简单)
- HDOJ/HDU 2567 寻梦(字符串简单处理)
- HDU-1039-Easier Done Than Said?(简单字符串处理)
- HDU 2399 GPA(简单字符串的处理)
- hdu 1800 简单字符串处理
- HDOJ/HDU 2567 寻梦(字符串简单处理)
- HDU 2672 god is a girl (字符串处理,找规律,简单)
- HDU 1088 处理每个字符串比直接用getchar处理简单
- hdu 2265 Encoding The Diary (基础的字符串处理,巨简单)
- HDU-1228-A + B(简单字符串处理)
- HDU 5585 Numbers(字符串的处理 简单题)——BestCoder Round #64(div.2)