ZOJ-2585
2014-04-07 21:29
183 查看
求回文距离,算比较水吧,第一次提交AC了60ms,看看别人的时间好少,发现算法可以改进,完全就不用排序,直接开个数组计数就行了,改进后就只用10ms了,附上改进前后代码
改进前:
改进后:
改进前:
#include<stdio.h> #include<string.h> #include<stdlib.h> static int cmp(const void *p1, const void *p2) { char *c1 = (char *) p1; char *c2 = (char *) p2; return *c1 - *c2; } int main() { int k, i, j, n; char s[100], t[100]; scanf("%d", &n); getchar(); for (k = 1; k <= n; k++) { gets(s); gets(t); int total = 0, a = strlen(s), b = strlen(t); qsort(s, a, sizeof(char), cmp); qsort(t, b, sizeof(char), cmp); i = j = 0; while (i < a && j < b) { if (s[i] < t[j]) { i++; total++; } else if (s[i] > t[j]) { j++; total++; } else { i++; j++; } } total += a - i + b - j; printf("Case #%d: %d\n", k, total); } return 0; }
改进后:
#include<stdio.h> #include<string.h> #include<stdlib.h> int main() { int k, i, j, n, a[26], b[26]; char s[100]; scanf("%d", &n); getchar(); for (k = 1; k <= n; k++) { int total = 0; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); gets(s); for (i = 0; s[i] != '\0'; i++) a[s[i] - 'a']++; gets(s); for (i = 0; s[i] != '\0'; i++) b[s[i] - 'a']++; for (i = 0; i < 26; i++) total += abs(a[i] - b[i]); printf("Case #%d: %d\n", k, total); } return 0; }
相关文章推荐
- HashMap
- 第五周作业——有向图邻接表表示及反向图构造
- Hadoop生态圈常用命令
- 判断文件和目录是否存在
- android shape corners 设置无效的解决
- linux下sed的使用(下)
- 集合加法
- 编译CEGUI For Ogre3d
- 4.4 spring-自定义标签的解析
- web farm 讨论引出
- hadoop0.20.2:The temporary job-output directory doesn't exist!
- BAT三巨头们的理想生意:要的就是高毛利
- HDU 4598 Difference
- Android OpenGL ES :材质渲染
- 【JAVA学习】java基本数据类型与字符串之间的转换(基本数据类型、对象封装类、自动装箱、自动拆箱)
- C++11 右值引用
- 探讨:使用httpClient在客户端与服务器端传输对象参数的详解
- CheckBox的使用(三):获取是否选中
- 我开博了
- 码农天气--码农自己的天气APP(一)