void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

文章分类 -  字符串+Hash

摘要:给出一些点坐标,问能组成多少个正方形。。。题目很简单,数据量不是很大,最容易想到的是,由于一个正方形一条边确定后,即两个点,可以根据三角形全等计算出另外两个点坐标根据此,可以把坐标由左下角向右上角的大小进行排序,然后枚举每两个点,进行bsearch另外两个点,找到cnt++,由于一个正方形可能被两组对边各计算一次,所以结果除以2即可。。。这题bs浪费时间较多,还有个办法就是把坐标hash了,借鉴了一个别人代码,用的思想是用点到源点的距离进行hash,然后再拉链解决冲突。。。bsearch枚举#include<stdio.h>#include<string.h>#incl 阅读全文
posted @ 2011-08-31 00:39 void-man 阅读(1313) 评论(0) 推荐(0)

摘要:特别好的一道综合题目,题木很简单,给出几段木棍,两端的颜色,问你是否能够组成一根长木棍,要求相接处用同一种颜色....首先要把颜色字符串给离散化标号,用字典树动态建立,然后标号后,再判断欧拉路之前要先用并查集判断连通性,基本就是这个思路了#include<iostream>#include<cstring>using namespace std;char clr1[11],clr2[11];int p[500010];int r[500010];int rec[500010];int num=1;struct node{ int id,i; node*next[27]; 阅读全文
posted @ 2011-08-30 22:30 void-man 阅读(237) 评论(0) 推荐(0)

摘要:给出一个木棒两端的颜色,问相同颜色的木棒可以连到一起,是否可以把所有木棒相连此题遇到很多问题,首先判断欧拉路好办,求出入度出度就ok,关键是怎么存储?放到数组然后每次查询一次??tle用map?很难给字符串编号。。。那就用字典树吧。。。。但是还要注意,必须要判断连通性,这里又是个问题这么大的数据量,就用并查集来判断连通吧,好了,到此问题解决了,看代码吧。。。#include<iostream>#include<cstring>using namespace std;char clr1[11],clr2[11]; int p[500010]; int r[500010]; 阅读全文
posted @ 2011-06-06 23:24 void-man 阅读(369) 评论(0) 推荐(0)

摘要:给出两个串,求出第一个在第二个中出现的次数#include <stdio.h>#include <string.h>void preKmp(char *src, int m, int *rule){ int i=0,j=-1; rule[0]=j; while(i<m){ while(j!=-1 && src[j] != src[i]) j=rule[j]; i++,j++; if(j>=m) rule[i]=rule[j-1]; else rule[i]=j; }}int recount=0;void kmp(char *src, int 阅读全文
posted @ 2011-06-06 23:17 void-man 阅读(1112) 评论(1) 推荐(0)

摘要:给出两个单词的映射关系,然后输入一个单词,查找它所对应的单词,没有的话输出eh字符串映射,用stl的map可以直接实现,代码量也比较少,关键是处理输入时候,回车表示输出结束,用gets接收#include <stdio.h>#include <stdlib.h>#include <iostream>#include <cstring>#include <string>#include <map>using namespace std;int main(){ int len; char str1[12],str2[12],f 阅读全文
posted @ 2011-06-06 23:02 void-man 阅读(606) 评论(0) 推荐(0)

摘要:顺便在这里发下牢骚吧,关于这次省赛感慨挺多的,十道题答上来五道,擦边拿了个二等奖,这次比赛的靓点不是哈工大包揽了很多一等奖,而是我们被哈三中的一个队伍给狂虐了.....这帮高中整信息学竞赛的真不敢小看啊,前途无量,,,,,,,目前开始准备下搞省赛吧开始进入整体,此题目大意,给出一个字符串,首先用间隔0的开始依次选出所有的两个字母问是否有相等的,再从间隔1开始,知道最后一个从间隔len-1,在每个间隔下都没有相同的串,有就是surprise没有就not看了下数据,总共79个字母,直接暴力美剧吧,在这里我用了一个小小的字母哈希,由于只有两个字母的串,我就用26*26+26大小的空间给hash了下直 阅读全文
posted @ 2011-05-23 23:48 void-man 阅读(282) 评论(0) 推荐(0)

摘要:给出多个字符串浮点数,,并且小数部分有且只有两位。。求和整数部分每隔三位有一个逗号分隔符,有个比较好的处理办法就是,先不考虑逗号跟小数点,直接相加进位求和,最后把后两位的前面加上小数点#include <iostream>#include <cstring>#include <string>using namespace std;#include <cstdio>int main(){ char s[50]; int n, i, j, k; char a[50], b[50]; while(scanf("%d", &n 阅读全文
posted @ 2011-04-17 14:56 void-man 阅读(225) 评论(0) 推荐(0)

摘要:问一个串是否是另一个的子串(不必连续也行),比较水,直接一个一个枚举出来即可起初定义串长度太小,总到时SGV错误#include <stdio.h>#include <string.h>int main(){char a[99999],b[99999];while(scanf("%s%s",a,b)!=EOF){int len1=strlen(a),len2=strlen(b),i,j; if(len2<len1)printf("No\n"); else {for(i=0,j=0;i<len1&&j&l 阅读全文
posted @ 2011-04-17 14:23 void-man 阅读(160) 评论(0) 推荐(0)

摘要:给出一个加法表达式,但是相加时候是向右进位,即低位进位,问你得到的结果是否正确,输出true||false直接读入串后把三个数存放到三个数组中,然后依次加每一位,然后低位进位即可#include<iostream>using namespace std;int a[8],b[8],c[8];char str[1000];int main(){ int i,j,k,p; while(cin>>str) { for(i=0;i<8;i++)a[i]=b[i]=c[i]=0;//初始化每一位都是10,为了后来相加时候不够的位补0 for(i=0,p=0;str[i]!= 阅读全文
posted @ 2011-04-17 14:16 void-man 阅读(340) 评论(0) 推荐(0)

摘要:给出几个串,然后统计相邻两个字母在总串中出现的次数,然后统计处个数最多的5个,并写出他们的频率猛一看感觉没头绪,是否要枚举每一种,感觉挺繁琐,但是先把两个字符串给hash出来,即前一个字母*256+后一个字母,得出的和即可表示所有两个ascii组合的hash值然后再按照每个hash值上的出现次数排序,由于题目要求树木相同的按照ascii字典排序,所以数目同的再按照他们的hash即可,因为hash值就是两个字母ascii的从小到大的组合其实有点统计字符串字母个数的问题,num[str[i]-'a']++的意思,这个是一个字母,统计两个的时候再hash下就ok#include< 阅读全文
posted @ 2011-04-17 13:54 void-man 阅读(333) 评论(0) 推荐(0)

摘要:给出几个人的成绩,以及路程,求出速度min/km字符串时间相加问题,关键就是处理进位,四舍五入比较麻烦,注意点#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){ char s[1000][10]; int len,i,j,n,num,a[10],flag; double sum,l,t,t1,v,v1; while(scanf("%d%lf",&n,&l)!=EOF) { while(scanf("%d",&num)! 阅读全文
posted @ 2011-04-17 13:22 void-man 阅读(222) 评论(0) 推荐(0)

摘要:题目就是给你n个人姓名,以及他们谁欠谁的钱,然你最后用最多n-1条规则(谁欠谁钱)罗列出欠钱的规则,要求钱还是平衡的由于是special judge那么用最简单的想,把其他除第一个人以外的人的钱全部都算到第一个人头上,那么钱最后还是balance的#include<stdio.h>#include <string.h>int check(char *str){ int num=1; for(int i=0;i<strlen(str);i++) num=num*(str[i]-'0'); return num%10000;}int main(){ i 阅读全文
posted @ 2011-04-17 12:55 void-man 阅读(228) 评论(0) 推荐(0)

摘要:读入一串字符串,期中包含电压,电流,功率期中的两个值,然你求出另外一个值,比较简单,就是读入时候首先要根据单位识别读入的是哪个值,然后要把数值字符串转换成相应的浮点数,最后还要进行单位换算,给出结果是挺麻烦复杂的,一定要小心其次就是一些字符串读入的函数的一些区别比如gets()可以读入整个串,包括空格,它以回车符结束标志,详见随笔,scanf,gets()区别直接上代码,慢慢看吧#include <stdio.h>#include <string.h>main(){ int n; char a[100]; float zheng,xiao,flag; while(sca 阅读全文
posted @ 2011-04-17 12:47 void-man 阅读(230) 评论(0) 推荐(0)

摘要:求出一个字符串中,它是一个子串的多少次方,要求最大用kmp算法求出next数组,当len%(len-next[len])==0时候,说明len-next[len]即为所能匹配的子串kmp算法详见随笔里面有#include <stdio.h>#include <string.h>char s[1000010];int next[1000010];int len;int main(){ int i,j; while(1) { scanf("%s",s); if(s[0]=='.')break; len=strlen(s); i=0;nex 阅读全文
posted @ 2011-04-17 11:42 void-man 阅读(513) 评论(0) 推荐(0)

摘要:输入一些字符串以及其代表的数值,然后再输入一大段字符串构成的文章,看其中包含所给字符串的数值和是多少为了节省时间,可以在输入一个比较一次来处理,知道输入为"."时候结束#include <cstdlib>#include <iostream>#include <string>using namespace std;int main(){ char words[1000][17]; long points[1000]; long point=0; int m,n; cin >>m>>n; for (int i1=0; 阅读全文
posted @ 2011-04-17 11:05 void-man 阅读(291) 评论(0) 推荐(0)