首页 > 其他分享 >【牛客小白77】D 字符串哈希

【牛客小白77】D 字符串哈希

时间:2023-09-02 12:11:43浏览次数:57  
标签:tem 密码 int ull long 77 牛客 哈希 字符串

https://ac.nowcoder.com/acm/contest/64384/D

题意

给你一串长度为 \(n (n \leq 10^6)\) 的密码,它是顺序输入的,如果截止到某一位,输入的最后 \(m\) 个字符是密码,那么之前输入的所有东西都清除。问目前检测到 \(k (m*k \leq n)\) 次输入成功,问密码可能的种类数

思路

很容易想到枚举密码,这样差不多是 \(n\) 种,然后我们需要对密码进行check。

如果暴力枚举check,总复杂度 \(O(n^2)\) ,超时

别的办法?字符串哈希!对当前字符串映射到的数值+1,然后记录该字符串最后一位出现的位置。如果上一次出现的最后一位比当前第一位还大或者一样,那么不合法,continue掉

code

#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
using namespace std;
const int N = 1e6 + 50, seed = 31;
int n, m, k;
char s[N];
ull h[N], base[N];
map<ull, int> cnt, las;

ull Hash(int l, int r) {
	return h[r] - h[l - 1] * base[r - l + 1];
}

int main () {
	ios::sync_with_stdio(false);
	cin >> n >> m >> k >> s + 1;
	h[0] = 0, base[0] = 1;
	for(int i = 1; i <= n; i++) {
		base[i] = base[i - 1] * seed;
		h[i] = h[i - 1] * seed + s[i] - '0';
	}
	for(int i = 1; i <= n; i++) {
		if(i + m - 1 > n) break;
		ull tem = Hash(i, i + m - 1);
		if(las[tem] >= i) continue;
		las[tem] = i + m - 1;
		cnt[tem]++;
	}
	int ans = 0;
	for(auto i : cnt) {
		if(i.second == k) ans++;
	}
	cout << ans << endl;
	return 0;
}

标签:tem,密码,int,ull,long,77,牛客,哈希,字符串
From: https://www.cnblogs.com/re0acm/p/17673530.html

相关文章

  • 1775_树莓派3B键盘映射错误解决
    全部学习汇总:GitHub-GreyZhang/little_bits_of_raspberry_pi:myhackingtripaboutraspberrypi.入手树莓派3B之后用了没有多长时间,最初的这段时间感觉想让它代替我的PC机是不肯能的。性能先不说,我完全没有找到当初在我的笔记本上使用Linux的感觉。再加上各种各样的问题,这让......
  • 1772_WPS关闭WPS热点和云服务等模块
    全部学习汇总:GitHub-GreyZhang/windows_skills:someskillswhenusingwindowssystem.说起来,WPS加入的WPS热点以及WPS云服务等可能还都是很不错的功能。不过,我不是很喜欢。我喜欢我能够更加自由地去随心所欲使用我用的软件,如果可能,最好是自由软件。虽说自由软件的王国里面有O......
  • 牛客小白月赛77 C题解 | 小Why的商品归位
    原题链接先不考虑车子的容量问题,因为结束位置保证是在起始位置之后的,那我们从前往后扫,发现是可以知道每个点时的车内的商品。但是现在有了容量限制,我们怎么办呢,如果对于一段,k都是大于每个点的货物量时,可以一趟装完,但是如果大于k就需要不知一次,可以发现所需的其实是该段的最大......
  • 牛客——SQL255 给出employees表中排名为奇数行的first_name
    描述对于employees表中,输出first_name排名(按first_name升序排序)为奇数的first_name输出格式:firstGeorgiAnneke请你在不打乱原序列顺序的情况下,输出:按first_name排升序后,取奇数行的first_name。如对以上示例数据的first_name排序后的序列为:Anneke、Bezalel......
  • TO-277封装肖特基二极管SP1545L:15A 45V
    目前,市面上供应肖特基二极管的厂家、供应商特别地多,更多选择的背后,带来的却是更多的迷茫和不知所措。采购肖特基二极管,哪家好呢?提及“东沃电子DOWOSEMI”这个国产二极管品牌,很多客户可能第一想到他家的TVS二极管、ESD二极管、稳压二极、压敏电阻MOV、陶瓷气体放电管GDT、自恢复保险......
  • ogg 的抽取进程 2015-06-17 05:51:08 ERROR OGG-02077
    报错信息如下HowtoresolveExtractAbendingWithOGG-02077Error(DocID2037420.1)这种情况是把抽取进程注册到数据库中了,你又强制启动相同的抽取进程,就会与数据库中注册的进程冲突,你可以执行下边语句删除数据库中抽取进程Stepstoclearthespecificextractcomponen......
  • [6]-代码随想录算法训练营-dat7-哈希表-part2
    代码随想录算法训练营第七天|哈希表-part21.LeetCode454.四数相加II题目https://leetcode.cn/problems/4sum-ii/submissions/思路无刷随想录后想法将四数相加转化为两数之和借用unordered_map,利用两数之和思想解决本问题实现困难代码尚模糊,不过整个......
  • 牛客练习赛114
    B题是纯数学期望推导,用到错位相减,注意数学式子推导过程中一些常数不要丢掉,由于式子其中一部分非常复杂导致计算出来后忘掉最初式子。c题待补D题是贪心,需要找到最优策略。策略是倒着推并且遇到当前数出现次数比他的出现次数多时就停下。不停下会导致多出现的呢个数没有数列带它走......
  • C-小美的01串翻转_牛客周赛 Round 9
    链接:https://ac.nowcoder.com/acm/contest/63869/C来源:牛客网题目描述小美定义一个01串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数。例如,"10001"的权值是1,因为只需要修改一次:对第三个字符取反即可。现在小美拿到了一个01......
  • CF1774 题解
    A考虑在所有\(0\)前添加正号,在\(1\)前轮流添加正负号即可。B首先根据抽屉原理,我们可以取出最多的颜色,个数记为\(mx\),然后其余颜色可以填在\(mx\)的两两中间,最少要有\((mx-1)(k-1)\)个空位。但是只是必要的,而不是充分的。考虑有多个最大值的情况,发现这些不是作为分界......