题目链接: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的更多相关文章

  1. 2013 Asia Regional Changchun C

    Little Tiger vs. Deep Monkey Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K ( ...

  2. HDU 4816 Bathysphere(数学)(2013 Asia Regional Changchun)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4816 Problem Description The Bathysphere is a spheric ...

  3. HDU 4822 Tri-war(LCA树上倍增)(2013 Asia Regional Changchun)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4822 Problem Description Three countries, Red, Yellow ...

  4. 2013 Asia Regional Changchun

    Hard Code http://acm.hdu.edu.cn/showproblem.php?pid=4813 #include<cstdio> ]; int main(){ int t ...

  5. 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 ...

  6. (并查集)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 ...

  7. (二叉树)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)  ...

  8. 2015ACM/ICPC Asia Regional Changchun Online /HDU 5438 图

    Ponds                                   Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 1310 ...

  9. 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 ...

随机推荐

  1. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  2. 封装upload文件上传类

    <?php //封装php中的单文件(图片)上传类 /*  //参数1:$file 文件数组  5个属性值 name,type,size,tmp,error   //参数2:文件保存的路径$pa ...

  3. 事务——sql server中的事务应用举例

    sql中事务只针对一个update,delete,insert语句,如果一段程序中有超过一个这样的语句,就需要每个都判断是否出错,否则就会出现若干我们不希望的情形出现,举例如下(表结构见最后): 1, ...

  4. JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面

    将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...

  5. sql over开窗函数,

    sql over开窗函数, 1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单 ...

  6. paper 19 :机器学习算法(简介)

    本来看了一天的分类器方面的代码,乱乱的,索性再把最基础的概念拿过来,现总结一下机器学习的算法吧! 1.机器学习算法简述 按照不同的分类标准,可以把机器学习的算法做不同的分类. 1.1 从机器学习问题角 ...

  7. 整理的java的日期DateUtil

    package cn.knet.data.untils; import java.text.SimpleDateFormat; import java.util.Calendar; import ja ...

  8. 前端单页应用SEO解决方案

    在这里只会提到Google的解决方案,日后再补充百度的解决方案 我们经常使用的单页都是#!来做应用的前端路由,因为这个在多个版本浏览器上有很好的兼容性 当Google发现URL里有#!符号,Googl ...

  9. Android中的通知—Notification 自定义通知

    Android中Notification通知的实现步骤: 1.获取NotificationManager对象NotificationManager的三个公共方法:①cancel(int id) 取消以 ...

  10. uboot启动参数

    bootcmd=nand read.jffs2 0x30007FC0 kernel; bootm 0x30007FC0bootdelay=2baudrate=115200ethaddr=08:00:3 ...