2013 Asia Regional Changchun I 题,HDU(4821),Hash
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4821
解题报告:搞了很久,总算搞出来了,还是参考了一下网上的解法,的确很巧,和上次湘潭的比赛中的一个求平方和的题目思路很类似。
首先说一下hash,简单来说就是y = hash(x),有很多函数,可以参考这里:https://www.byvoid.com/blog/string-hash-compare/
然后,我用的是这个:写法简单,而且重复的可能较小。
// BKDR Hash Function
unsigned int BKDRHash(char *str)
{
unsigned int seed = ; // 31 131 1313 13131 131313 etc..
unsigned int hash = ; while (*str)
{
hash = hash * seed + (*str++);
} return (hash & 0x7FFFFFFF);
}
然后回到这个题目:
3W,4RE,3TLE,首先wa的原因:循环次数少了一,<=slen,超时没办法,只能优化了。
下面是没有优化的代码,每个子串求一下hash.
/*
#include <cstdio>
#include <cstring>
#include <string> using namespace std; const int inf = 2000000; bool t[2000000];
int Hash[100005]; long long myhash(char *str)
{
int seed = 31;
long long hash = 0;
while (*str)
hash =( hash * seed + (*str++)-'a' + 1) %inf ;
return hash;
} int main()
{
int m,l;
while(scanf("%d%d",&m,&l)!=EOF)
{
char str[100005];
scanf("%s",str);
int len = strlen(str);
int ans = 0; int k = 0;
for(int i=0; i+m<len; i++)
{
char temp[100005];
for(int j=0; j<l; j++)
temp[j] = str[i+k*m+j];
temp[l] = '\0';
long long hashs = myhash(temp);
Hash[i+k*m] = myhash()
} for(int i=0; i<l&&i+m*l<=len; i++)
{
memset(t,false,sizeof(t));
bool flag = true;
for(int k = 0; k<m; k++)
{
char temp[100005];
for(int j=0; j<l; j++)
temp[j] = str[i+k*m+j];
temp[l] = '\0';
long long hashs = myhash(temp);
if(t[hashs])
{
flag = false;
break;
}
t[hashs] = true;
}
if(flag) ans++;
}
printf("%d\n",ans);
}
return 0;
} */
优化方案。上图比较好!!!

优化的位置就是成段删掉,成段添加。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map> using namespace std;
const int MAXN = ;
const unsigned long long base = ; unsigned long long nbase[MAXN],Hash[MAXN];
int n,len,ans,slen;
char str[MAXN];
map<unsigned long long, int> mp; int main()
{
unsigned long long tmp;
nbase[] = ;
for (int i = ; i <= MAXN; i++)
nbase[i] = nbase[i-] * base; while (scanf("%d%d", &n, &len) != EOF)
{
scanf("%s", str);
slen = strlen(str);
Hash[slen] = ;
for (int i = slen-; i >= ; i--)
Hash[i] = Hash[i+]*base+str[i]-'a'+; ans = ;
for (int i = ; i < len && i+n*len <= slen; i++)
{
mp.clear();
for (int j = i; j < i+n*len; j += len)
{
tmp = Hash[j] - Hash[j+len]*nbase[len];
mp[tmp]++;
}
if (mp.size() == n)
ans++;
for (int j = i+n*len; j+len <= slen; j += len)
{
tmp = Hash[j-n*len] - Hash[j-(n-)*len]*nbase[len];
mp[tmp]--;
if (mp[tmp] == )
mp.erase(tmp);
tmp = Hash[j] - Hash[j+len]*nbase[len];
mp[tmp]++;
if (mp.size() == n)
ans++;
}
}
printf("%d\n", ans);
}
return ;
}
2013 Asia Regional Changchun I 题,HDU(4821),Hash的更多相关文章
- 2013 Asia Regional Changchun C
Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K ( ...
- HDU 4816 Bathysphere(数学)(2013 Asia Regional Changchun)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 Problem Description The Bathysphere is a spheric ...
- HDU 4822 Tri-war(LCA树上倍增)(2013 Asia Regional Changchun)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4822 Problem Description Three countries, Red, Yellow ...
- 2013 Asia Regional Changchun
Hard Code http://acm.hdu.edu.cn/showproblem.php?pid=4813 #include<cstdio> ]; int main(){ int t ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU 5444 Elven Postman【二叉排序树的建树和遍历查找】
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- (并查集)Travel -- hdu -- 5441(2015 ACM/ICPC Asia Regional Changchun Online )
http://acm.hdu.edu.cn/showproblem.php?pid=5441 Travel Time Limit: 1500/1000 MS (Java/Others) Memo ...
- (二叉树)Elven Postman -- HDU -- 54444(2015 ACM/ICPC Asia Regional Changchun Online)
http://acm.hdu.edu.cn/showproblem.php?pid=5444 Elven Postman Time Limit: 1500/1000 MS (Java/Others) ...
- 2015ACM/ICPC Asia Regional Changchun Online /HDU 5438 图
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 1310 ...
- hdu 5444 Elven Postman(二叉树)——2015 ACM/ICPC Asia Regional Changchun Online
Problem Description Elves are very peculiar creatures. As we all know, they can live for a very long ...
随机推荐
- [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 封装upload文件上传类
<?php //封装php中的单文件(图片)上传类 /* //参数1:$file 文件数组 5个属性值 name,type,size,tmp,error //参数2:文件保存的路径$pa ...
- 事务——sql server中的事务应用举例
sql中事务只针对一个update,delete,insert语句,如果一段程序中有超过一个这样的语句,就需要每个都判断是否出错,否则就会出现若干我们不希望的情形出现,举例如下(表结构见最后): 1, ...
- JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面
将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...
- sql over开窗函数,
sql over开窗函数, 1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单 ...
- paper 19 :机器学习算法(简介)
本来看了一天的分类器方面的代码,乱乱的,索性再把最基础的概念拿过来,现总结一下机器学习的算法吧! 1.机器学习算法简述 按照不同的分类标准,可以把机器学习的算法做不同的分类. 1.1 从机器学习问题角 ...
- 整理的java的日期DateUtil
package cn.knet.data.untils; import java.text.SimpleDateFormat; import java.util.Calendar; import ja ...
- 前端单页应用SEO解决方案
在这里只会提到Google的解决方案,日后再补充百度的解决方案 我们经常使用的单页都是#!来做应用的前端路由,因为这个在多个版本浏览器上有很好的兼容性 当Google发现URL里有#!符号,Googl ...
- Android中的通知—Notification 自定义通知
Android中Notification通知的实现步骤: 1.获取NotificationManager对象NotificationManager的三个公共方法:①cancel(int id) 取消以 ...
- uboot启动参数
bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0bootdelay=2baudrate=115200ethaddr=08:00:3 ...