poj1200 2010.2.20
2016-02-05 14:29
197 查看
poj1200 2010.2.20
nc进制+hash
首先,这个题说有nc个字母,但出现的字母并没有什么规律,如'a'、'b'、'c'....(可能出现有c却没有b的情况)因此给这些字母编号,不能简单的用" -'a' "直接得到,因此,怎么给这些字母编号成了一个问题,呵呵,这一点是看网上的
nc进制+hash
首先,这个题说有nc个字母,但出现的字母并没有什么规律,如'a'、'b'、'c'....(可能出现有c却没有b的情况)因此给这些字母编号,不能简单的用" -'a' "直接得到,因此,怎么给这些字母编号成了一个问题,呵呵,这一点是看网上的
#include<stdlib.h> //这题将字符串转换为一个nc进制的数,判断这个 //数是否重复出现即可 #include<memory.h> #include<stdio.h> #include<iostream> using namespace std; #define MAX 20000000 bool c[MAX]; char x[MAX]; //将字母转换为对应的数字,因为字母可能不是连续的 //如nc = 3时可能会有aeccc这种字符串 //处理后a,c,e分别代表0,1,2 int ascii[256]; int main() { int n,nc; while(scanf("%d%d\n",&n,&nc)!=EOF) { memset(c,0,sizeof(c)); memset(ascii,0,sizeof(ascii)); int tmp,res(0); scanf("%s",x); int len = strlen(x); //将出现过的字母都标记为-1(true) for(int i = 0; i < len; i++) ascii[x[i]] = -1; int zz = 0; //为出现过的字母分配数字 for(int i = 0; i < 256; i++) if(ascii[i]) ascii[i] = zz++; bool flag; len = len - n + 1; for(int i = 0; i < len; i++) { flag = true; tmp = 0; //将子字符串转换为nc进制数 for(int j = 0; j < n; j++) tmp = tmp*nc + ascii[x[i+j]]; tmp = abs(tmp)%MAX; if(!c[tmp]){ res++; c[tmp] = true; } } printf("%d\n",res); } return 0; }
相关文章推荐
- iOS FMDB 不需要关闭
- DataTable、DataView、DataReader和DataSet,DataGrid等的区别
- 一元多项式的建立及其运算
- 【POI2008】【BZOJ1132】Tro
- poj2488 2010.2.20
- 怎么给kibana加上权限?
- CocoaPods 创建Podfile 导入第三方库 详细全程图文指导
- Lambda 表达式
- Android 获取屏幕的宽度和高度
- poj1129 2010.2.18
- iOS 浮点型四舍五入精确值问题
- 从头认识Spring-1.16 SpEl对集合的操作(1)-建立集合以及访问集合的元素,以<util:list/>为例
- 概率图模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-多项式贝叶斯
- 如何把SQLServer数据库从高版本降级到低版本?
- 教你如何打造完美集引导安装一体U盘
- 第一届蓝桥杯C/C++组编程题1 黑色星期五
- Exercise1_3_33
- 装IIS时遇到一个Server Application Error错误解决
- 计算机网络体系结构
- chmod 命令