字符串哈希——Beads
传送门:Beads
思路:
暴力枚举每一种长度,同时正着算一遍哈希值再反着算一遍哈希值,计算每一种长度的区间时算正向的哈希值和反向的哈希值,用一个set存最小的那一个,最后set里面的元素个数就是长度为k的区间所能得到的不同区间的个数。
时间复杂度为调和级数式,O(NlogN).
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
typedef unsigned long long ull;
const int pp=13331,N=2e5+10;
int a[N];
set<ull>v;
ull p[N];
int ans[N],cnt;
ull s[N];
ull s1[N];
int n;
ull get(ull a[],int l,int r)
{return a[r]-a[l-1]*p[r-l+1];
}
ull get1(ull a[],int l,int r)
{return a[l]-a[r+1]*p[r-l+1];
}
int get_ans(int x)
{v.clear();for(int i=1;i+x-1<=n;i+=x){int r=i+x-1;ull t=min(get(s,i,r),get1(s1,i,r));v.insert(t);}return (int)v.size();
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);p[0]=1;for(int i=1;i<=n;i++){s[i]=s[i-1]*pp+a[i];p[i]=p[i-1]*pp;}for(int i=n;i;i--){s1[i]=s1[i+1]*pp+a[i];}int sum=0;for(int i=1;i<=n;i++){int t=get_ans(i);if(t==sum) ans[++cnt]=i;else if(t>sum){sum=t,cnt=0;ans[++cnt]=i;}}cout<<sum<<' '<<cnt<<endl;for(int i=1;i<=cnt;i++)cout<<ans[i]<<' ';return 0;
}
字符串哈希——Beads相关推荐
- ELFhash - 优秀的字符串哈希算法
原 ELFhash - 优秀的字符串哈希算法 分类:算法杂论算法精讲数据结构 (1424) (2) 1.字符串哈希: 我们先从字符串哈希说起 在很多的情况下,我们有可能会获得大量的字符串,每个字符串 ...
- 【CodeForces】961 F. k-substrings 字符串哈希+二分
[题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} ...
- 138. 兔子与兔子【字符串哈希】
很基础的字符串哈希 #include<bits/stdc++.h> using namespace std; typedef unsigned long long int ull; con ...
- Singing Superstar 字符串哈希-map操作
题意 : 给一长度 < 1e5 的字符串s,q < 1e5次询问,每次问一个长 < 30 的串 t 在s中出现的次数,且t不可重叠. 例 : "abababa"中 ...
- 中石油训练赛 - DNA(字符串哈希)
题目链接:点击查看 题目大意:给出一串只由A,C,G,T组成的字符串,再给出一个数字k,问每个长度为k的连续子串,出现的次数最多是多少次 题目分析:O(n)哈希一下,O(n)更新一下用无序map维护的 ...
- HDU - 3613 Best Reward(字符串哈希)
题目链接:点击查看 题目大意:给出一个字符串,每个字母都有一个贡献值,现在要将这个字符串拆成两个子串,如果子串是回文串的话,贡献就是其中每个字母的贡献和,现在问贡献最大为多少 题目分析:很简单的一道回 ...
- 怎么把字符串变成数组_字符串哈希:从零开始的十分钟包会教程
大家吼啊!这是我下定决心写专栏以来的第二篇文章,请大家多多资瓷!!同样我们先以上次的话起头吧! 恭喜你找到了这篇博客!虽然这个标题看起来非常像是nc营销号的标题但是!请相信我一次这是真的!如果不行请随 ...
- [Leetcode][程序员面试金典][面试题17.13][JAVA][恢复空格][动态规划][Trie][字符串哈希]
[问题描述][中等] [解答思路] 1. 动态规划 动态规划流程 第 1 步:设计状态 dp[i] 表示字符串的前 i 个字符的最少未匹配数. 第 2 步:状态转移方程 假设当前我们已经考虑完了前 i ...
- 【牛客 -2A】矩阵(二分,字符串哈希)
题干: 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每行 ...
最新文章
- App移动端性能工具调研
- leetcode:203. 移除链表元素(两种方法)
- python基础技巧总结(一)
- 吐槽大会4_《吐槽大会4》不愧都是国家队,真吐槽!孙杨霸气喊话霍顿
- 京东将回购计划授权增至30亿美元并延期至2024年
- 概率图模型笔记(一)开坑
- 软件测试总结--01基础
- 工具使用教程 (一)【Git从原理到入门实用教程】
- 解决在IE浏览器中JQuery.resize()执行多次的方法(转)
- 虚拟光驱安装服务器无法运行,Win7新装虚拟光驱无法打开的解决方法
- 实践致知第6享:QQ截图的文字识别功能
- 如何提高团队的研发效率呢?
- chart metadata is missing these dependencies
- 利用QVOD架设流媒体服务器/电影服务器/vod服务器
- 【北邮国院大三上】电子商务法(e-commerce law)知识点整理——Banking Lawe-Payment
- 在B站,没有什么是不能搞CP的
- 【@NotNull和@NotBlank的区别】
- jacoco—增量代码覆盖率实现
- Alphabet 超越苹果成为全球市值最高公司
- Java小技能:异常处理