[COCI 2018#5]Parametriziran

这道题呢!
在这里插入图片描述
算了,不要让这玩意儿活着祸害众生吧!让我们来拯救苍生于苦海之中!!
骚话连篇ing

题目

由小写英文字母和问号组成的字符串成为参数化单词(例如:??cd,bcd,??)。如果两个单词中的问号符号可以由英语字母表的任意小写字母替换,则这两个参数化单词可以认为是相似的,可以得到相同的字符串。例如:现在有两个参数化单词a???和?b?a,我们可以通过置换两个单词中的问号,获得单词abba。

Mirko最近获得了一组参数化单词集合,在这个集合一共有N个单词,Mirko对这N的单词中存在多少对相似参数化单词很感兴趣。集合中的所有单词的长度都为M,且集合中同一个单词可能出现多次。

输入格式
第一行输入两个数字N(1≤N≤50000)和M(1≤M≤6)
接下来输入N行字符串,每行的长度为M,表示输入的参数化单词。
输出格式
输出相似的参数化单词的对数。

样例
样例输入1
3 3
??b
c??
c?c
样例输出1
2
样例输入2
4 6
ab??c?
??kll?
a?k??c
?bcd??
样例输出2
3
样例输入3
5 2
??
b?
c?
?g
cg
样例输出3
8
数据范围与提示
在第一组样例中,相似的两对参数化单词为:(??b,c??)和(c??,c?c)。

题解

这道题map为TLE,string为MLE,需要unordered_map+hash才行!orz
在这里插入图片描述
首先,由数据范围可知,n很大,m很小,
那么,我们就可以对m进行一个hash操作,
由于总共的字母数是26个,小于2^5,
即如果我们把每一位的字母都通过乘以2^(5*j),数据范围也是在int内的。

那么,我们对每一行的字母,都可以处理出一个hash值,
由于会存在有?的情况,我们可以另外开一个数组,用于验证这个位置是否为?。
其实用map就可以搞定!

接着找两行,如果第i行的字母hash值和第j行的验证串取与操作得到的答案和第j行的字母hash值和第i行的验证串取于得到的答案相同,
因为如果验证串验证的那个位置有字母,
则全是1,取与得到的值就是那个位置字母的值,
如果验证串那个位置无字母,则全是0,取与得到的也全是0,则答案也全是为0
则ans++。

也可以这么理解:
假设当前串为"?a??b?c??",对于之前的串,管它有多少‘?’,
只要abc三个位置为:“abc”,“ab?”,“a?b”,“a??”,"?bc","?bc"……
就可以匹配了,所以记录某些位置上为各种情况的方案数即可

unordered_map的头文件是#include<unordered_map>
但是如果你的C++编译器比较low,像本仙女的一样
就很容易报错,bits万能头文件都没有用

如果报错可以换为以下写法:

#if(__cplusplus == 201103L)
#include <unordered_map>
#include <unordered_set>
#else
#include <tr1/unordered_map>
#include <tr1/unordered_set>
namespace std {using std::tr1::unordered_map;using std::tr1::unordered_set;
}
#endif

删掉set也是OK哒!亲(づ ̄3 ̄)づ╭❤~

#if(__cplusplus == 201103L)
#include <unordered_map>
#else
#include <tr1/unordered_map>
namespace std {using std::tr1::unordered_map;
}
#endif

好了,话不多说,屁不多放,上马!

代码实现

#include <cstdio>
#include <iostream>
#if(__cplusplus == 201103L)
#include <unordered_map>
#else
#include <tr1/unordered_map>
namespace std {using std::tr1::unordered_map;
}
#endif
using namespace std;
#define LL long long
#define MAXN ( 1 << 7 ) + 5
int n, m, opt, num;
char str[7];
LL result;
unordered_map < int, int > vis[MAXN];
int Hash ( string x ) {int len = x.length();int ans = 0;for ( int i = 0;i < len;i ++ )if ( x[i] == '?' ) ans = ans * 27 + 26;else ans = ans * 27 + ( x[i] - 'a' );return ans;
}
int main() {scanf ( "%d %d\n", &n, &m );string tmp, res; for ( int i = 1;i <= n;i ++ ) {scanf ( "%s", str );opt = 0;num = 0;tmp = "";for ( int j = 0;j < m;j ++ ) {if ( str[j] != '?' ) {opt |= ( 1 << j );num = ( num << 1 ) | 1;tmp += str[j];}}if ( tmp == "" )result += i - 1;else {for ( int j = 0;j <= num;j ++ ) {res = "";for ( int k = 0;( 1 << k ) <= num;k ++) {if ( j & ( 1 << k ) ) res += tmp[k];else res += '?';}if ( vis[opt].count ( Hash ( res ) ) )result += ( LL ) vis[opt][Hash ( res )];}}for ( int j = 0;j < ( 1 << m );j ++ ) {tmp = "";for ( int k = 0;k < m;k ++ ) {if ( j & ( 1 << k ) ) tmp += str[k];}vis[j][Hash ( tmp )] ++;}}printf ( "%lld", result );return 0;
}

好了,好好理解这份代码哦~
有任何问题都可以留言,我要我们的公司做到世界五百强
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318347.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

传送门 文章目录解析解析 很显然&#xff0c;让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题&#xff0c;其实第一感觉是bfs 但是状态数理论上最差可以达到815&#xff0c;&#xff08;当然基本不可能跑满&#xff09;&#xff…

NumSharp v0.6 科学计算库发布,新增 LAPACK 的线性库支持

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

[COCI] Zamjena

连这种模拟题都能。。。orz ex&#xff0c;太恶心了&#xff01; 驰骋坑底这么久了&#xff0c;我明白了 开始吧&#xff01;我发誓&#xff0c;这个超级兵&#xff0c;我就算用小书包平A都要A了它 题目 Vlatko喜欢使用整数数组&#xff0c;他在一张纸上写下了两个数组&…

P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)

洛谷传送门 文章目录题目描述解析代码题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点&#xff0c;二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直接枚举左上方的点二分呢&#xff1f;awa 很遗憾的是… 那样答案就没有…

初赛—错题集

计算机基础知识 LAN&#xff1a;局域网&#xff0c;WAN&#xff1a;广域网&#xff0c;MAN&#xff1a;城域网 汇编语言是(依赖于具体计算机)的低级程序设计语言 计算机操作的最小时间单位是(时钟周期)。 注意所需空间需要 \(\div 8\) &#xff01;&#xff01;&#xff01;…

.NET Core 和 DevOps

关键要点无论你目前使用什么样的技术栈&#xff0c;DevOps 都是值得一试的。闭源、专有软件和构建过程与 DevOps 实践不兼容。.NET Core 是开源的&#xff0c;是基于 DevOps 构思和构建的。.NET Core CLI 和 Roslyn API 让整个交付流程变得更加开放&#xff0c;且具有更强的适应…

Message Decoding密码翻译

这是一道模拟题ex 其实每一道模拟题都很“简单”&#xff0c; 这道题就是难在读英文题&#xff01;处理输入&#xff01; 真的我竟然花了几个小时就只是为了看懂样例&#xff01;&#xff01;orz 题目大意 考虑下面的01串序列&#xff1a; 0&#xff0c;00&#xff0c;01…

.NET Core开发日志——结构化日志

在.NET生态圈中&#xff0c;最早被广泛使用的日志库可能是派生自Java世界里的Apache log4net。而其后来者&#xff0c;莫过于NLog。Nlog与log4net相比&#xff0c;有一项较显著的优势&#xff0c;它支持结构化日志。结构化日志&#xff0c;也被称为语义化日志。其作用有二&…

YBTOJ 特殊数列(哈希表)

文章目录题目描述解析代码题目描述 解析 应该是哈希表板子题了 选一个1e6左右的质数进行处理即可 其实本质就是链前 没啥特别新鲜的 为什么要写呢&#xff1f; 因为这个东西很早之前看的时候完全没有看懂。。。 代码 #include<bits/stdc.h> using namespace std; #def…

Strange Definition CodeForces - 1471D

题意&#xff1a; 定义数字 x 和 y 是“相邻”的当且仅当 lcm(x,y)/gcd(x,y) 是一个平方数。 给定一个长度为 n 的数组 a。 每过一秒&#xff0c;数组 a 会发生变化&#xff1a;ai 会变成数组 a 中与其“相邻”的所有数字的乘积。 定义 di 为数组 a 中与 ai “相邻” 的数字个…

学习三分 (概念 + 模板 + 例题:曲线)

这好像是我第一次尝试写一个新知识入门 而不是习题解 文章目录三分概念模板例题&#xff1a;曲线题目题解代码实现三分概念 我们都知道&#xff0c;二分是在一个单调函数&#xff08;即一次函数&#xff09;上通过每次查找折半的方式&#xff0c;对答案进行搜索查找。那么&am…

迎元旦,庆surging 1.0发布

一位摄影程序员的独白每个人都有爱好&#xff0c;都有释放压力的活动&#xff0c;而我也不例外&#xff0c;我除了每天上班&#xff0c;周末就会约一群好友去拍妹子&#xff0c;成家后&#xff0c;就改为拍虫子&#xff0c;一拍就到了30岁&#xff0c;到了30岁就感觉到了中年的…

YBTOJ:求好元素(哈希表)

文章目录题目描述解析代码题目描述 解析 如果枚举m,n,p的话是n3的 会超时 但我们注意到右边查询只有O(n) 这就很不平衡 所以考虑把p移到右边&#xff0c;预处理枚举m、n存到哈希表中 查询枚举i、p 这样就把复杂度均摊降到了n2 但是本题数据较强 所以我们得保证哈希表的单词查询…

Strange Shuffle CodeForces - 1471E(交互题)

交互题 这类型不同于普通的题。 可以理解为有个问题需要你解决&#xff0c;你通过输入某些东西表示你要问系统的问题&#xff0c;这时系统会回答你的问题。在代码中的回答方式就是会输入某个东西就是系统给你的答案&#xff0c;通过这些信息你可以得到问题的解你是不可以自己测…

学习KMP (概念 + 模板 + 例题: 子串查找)

我又回来了&#xff0c;感jio这几天有点勤啊&#xff01;&#xff01; 这一次我带着KMP来了&#xff0c; 文章目录KMP介绍模板例题&#xff1a; 子串查找题目暴力题解KMP题解代码实现KMP介绍 KMP&#xff0c;即 Knuth-Morris-Pratt 字符串查找算法&#xff0c;由Donald Knuth…

直播预告 - 博时基金DevOps体系建设和自动化测试分享

最近几年&#xff0c;基金行业发展比较快&#xff0c;业务范围从传统公募到大资管&#xff0c;业务地域从中国大陆到全球化&#xff0c;在互联网金融浪潮中扮演了重要角色&#xff0c;金融科技又带来新的挑战和机遇。据毕马威2014年研究报告显示&#xff0c;由于新技术、人口变…

YBTOJ:公共子串(KMP)

文章目录题目描述解析代码题目描述 解析 我的做法是二分答案&#xff0c;暴力枚举子串&#xff0c;对其他的字符串进行KMP。 复杂度logL*L2 没有一次AC&#xff0c;因为忘记了字符串清零&#xff01;&#xff0c;否则它会和上次二分的字符串没被覆盖到的部分连在一起。 之前遇…

Asp.Net Core + Docker 搭建

一、Docker安装&#xff08;1&#xff09;机器准备 本次实验&#xff0c;我是在Win10上,使用Vmware Workstation虚拟机安装的Ubuntu 18.04.l LTS版本进行搭建。&#xff08;2&#xff09;安装Docker# yum install docker注意:如果提示未安装yum 使用命令:apt-get install yum&a…

数数字

今天中午1小时&#xff0c;定时两道&#xff0c;我就知道自己的太阳降落了。。。orz 文章目录题目题解代码实现题目 PB 带来了若干只蒟蒻。 众所周知&#xff0c;NTF 是数论学会的会长&#xff0c;于是 PB 准备用数字击败 NTF&#xff0c;以证明 PB 比 NTF 更强。 于是 PB 准…

YBTOJ:前缀数组(KMP)

文章目录题目描述解析代码题目描述 解析 题面脸上写着5个大字&#xff1a;我是KMP 但是本题没有自己做出来。。。我一开始的思路其实很接近题解了&#xff0c;只是被我舍弃了qwq。 后来卡在暴力nL2的瓶颈上&#xff0c;用了个倍增的诡异操作搞到了nLlogL&#xff0c;但是n5&am…