牛客网NOIP赛前集训营-普及组(第一场)
前三题略
T4:
题目描述
对于第1,2个数据点: 保证每个字符串只包含前4个小写字母
对于第3,4个数据点:每个字符串都只包含一种字母
对于第5,6个数据点:n<=10,L<=100
对于所有数据,满足:n <= 100, L <= 1000,K <= 28,每个字符串只包含前8个小写字母
关键点还是只有8个字符!!
哈希本质还是一个P进制数
所以,对于每一个字符串的哈希,其实是每个字符作为这一位的数拼成的。
不一定每次必须要顺序从左到右,只要char * base^i做对,就可以嘛。
所以,可以记录下来,对于每一个字符串s,每一个字符c,c在s中出现的所有位置的base^i的和,可以预处理。
然后,每次判断的时候,
每个字符hsh就不用O(L)扫了。直接通过枚举每个字符的现在值,乘上预处理的base们和,再做和即可!
就O(8)处理一个串的哈希值了。
然后就 轻轻松松AC
代码:
注意箱子枚举的方法。
可以严格O(1701)处理,节省时间。
判断往之前箱子放,和新开箱子是有条件的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
const int M=;
const int mod=1e9+;
const ll P=; int n,l,k;
char a[N][M];
map<ll,int>mp;
ll mi[M];
ll sum[N][];
ll be[];
int sz[];
int ans=;
void dfs(int x,int box){
if(x==){
mp.clear();
int alike=;
bool fl=false;
for(int i=;i<=n;i++){
ll hsh=;
for(int j=;j<=;j++){
(hsh+=sum[i][j]*be[j])%=mod;
}
alike+=mp[hsh];
mp[hsh]+=;
} ans=max(ans,alike);
return;
}
if(-x>=k-box){
for(int i=;i<=box;i++){
be[x]=i;
sz[i]++;
dfs(x+,box);
be[x]=;
sz[i]--;
}
}
if(box<k&&sz[box]){
be[x]=box+;
sz[box+]++;
dfs(x+,box+);
be[x]=;
sz[box+]--;
}
}
int main()
{
scanf("%d%d%d",&n,&l,&k);
k=max(-k,);
for(int i=;i<=n;i++){
scanf("%s",a[i]+);
}
mi[]=;
for(int i=;i<=l;i++){
mi[i]=(mi[i-]*P)%mod;
}
for(int i=;i<=n;i++){
for(int j=;j<=l;j++){
(sum[i][a[i][j]-'a']+=mi[j])%=mod;
}
}
dfs(,);
printf("%d",ans);
return ;
}
总结:
这个题非常好的抓住了哈希的本质!
哈希是一个映射,但是本质是一个P进制数。
再利用8个字符的条件,就可以通过预处理,分着把hsh快速算出来了!
(以后如果碰到什么26个字符,但是长度很长,而且要重复hsh多次的,也许可以用上
而且是所有的一类字符变成另一类的那种。
)
牛客网NOIP赛前集训营-普及组(第一场)的更多相关文章
- 牛客网NOIP赛前集训营-普及组(第二场)和 牛客网NOIP赛前集训营-提高组(第二场)解题报告
目录 牛客网NOIP赛前集训营-普及组(第二场) A 你好诶加币 B 最后一次 C 选择颜色 D 合法括号序列 牛客网NOIP赛前集训营-提高组(第二场) A 方差 B 分糖果 C 集合划分 牛客网N ...
- [牛客网NOIP赛前集训营-普及组(第二场)]D-合法括号序列
链接:https://www.nowcoder.com/acm/contest/165/D来源:牛客网 合法括号序列 键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字 ...
- 牛客网NOIP赛前集训营-普及组(第七场)
链接:C 来源:牛客网 牛牛的同学给牛牛表演了一个读心术:牛牛先任意选定一个非负整数,然后进行N次操作:每次操作前,假设牛牛当前的数是a,那么这个操作可能是a = a + x, 或者a = a * x ...
- Nowcoder | [题解-N165]牛客网NOIP赛前集训营-普及组(第二场)
啊...表示一大早还没睡醒就开始打比赛(开始前一分钟的我还在桌子上趴着休眠)...表示题目思路清奇(尤其C题)...但是我还是太蒻了...\(D\)题暴力都没打...题解正式开始之前先\(\%\)一下 ...
- 牛客网NOIP赛前集训营-普及组(第一场)C 括号
括号 思路: dp 状态:dp[i][j]表示到i位置为止未匹配的 '(' 个数为j的方案数 状态转移: 如果s[i] == '(' dp[i][j] = dp[i-1][j] + dp[i-1][j ...
- 牛客网NOIP赛前集训营-普及组(第二场)
T1 牛牛刚学习了输入输出,他遇到了一道这样的题目. 输入2个整数a和b 保证输入的a和b在long long范围之内,即满足 -9223372036854775808 <= a, b < ...
- 牛客网NOIP赛前集训营-普及组
第一场: A-绩点 题目描述 小A刚考完大学考试.现在已经出了n门课的成绩,他想自己先算一下这些课的绩点是多少.设第i门课的他拿到的绩点是gpai,而这门课的学分是sci,那么他的总绩点用下面的公式计 ...
- 牛客网 NOIP赛前集训营-普及组(第四场)C--部分和 (高维前缀和)
传送门 解题思路 高维前缀和模板题.首先,求前缀和有两种方式,比如说对于求二维前缀和来说. 第一种 : for(int i=1;i<=n;i++) for(int j=1;j<=n;j++ ...
- 牛客网NOIP赛前集训营-提高组(第四场)游记
牛客网NOIP赛前集训营-提高组(第四场)游记 动态点分治 题目大意: \(T(t\le10000)\)组询问,求\([l,r]\)中\(k(l,r,k<2^{63})\)的非负整数次幂的数的个 ...
随机推荐
- wc命令详解
基础命令学习目录首页 原文链接:http://www.cnblogs.com/peida/archive/2012/12/18/2822758.html Linux系统中的wc(Word Count) ...
- nodejs的Cannot find module 'body-parser'
http://blog.csdn.net/u014345860/article/details/77769253
- C++ 函数 参数传递方式
用函数调用所给出的实参(实际参数,actual arguments)向函数定义给出的形参(形式参数,formal arguments)设置初始值的过程,叫做参数传递(Argument Passing) ...
- 跟踪调试Linux内核的启动过程
跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
- pycharm 2017注册码
1.在浏览器的地址栏输入:http://idea.lanyus.com/,该网址,无需修改用户名,点击获取注册码.复制该注册码,粘贴在注册界面的Activation code的输入框中,点击 ok 该 ...
- 读书笔记 之 java编程思想3
现在已经读到第二章 ,这个发现好多已经能都知道了 但是还是有自己比较生疏的比如说就是 储存到什么地方:书中介绍五种储存的地方 分别为1储存器,2堆栈,3堆4常量储存 5非RAM储存,java的出来 ...
- 在WPF里实现计算器软件
一.具体代码 类代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; us ...
- Week2-作业1-part2.阅读与思考
第一章.概论 原文: 在成熟的航空工业中,一个飞机发动机从构思到最后运行,不知道经历过多少人.多少工序.多少流程.多少相关知识的验证.我们无法想象,某个商用型号的发动机在飞行时发现问题,最初的设计师会 ...
- 今年暑假要AC
今年暑假要AC 在这个大学的第一个的暑假,谁不想回去high呢~ 但是,这是不行的,还没有AC,你能回去吗?高三那年的暑假怎么玩的,现在补回来吧...有规模有计划有氛围的学习就是:优点多效率好激情足~ ...
- ACM的fflush(stdin)的问题
在最近的刷题过程中,因为用到了很多字符串的操作,有时需要多次清空缓冲区,所以用了fflush(stdin);的语句,确实很好用,但是发现在OJ上提交后会出现runtime error的问题.当时并没有 ...