这道题呢!

算了,不要让这玩意儿活着祸害众生吧!让我们来拯救苍生于苦海之中!!
骚话连篇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;
}

好了,好好理解这份代码哦~
有任何问题都可以留言,我要我们的公司做到世界五百强 !

[COCI 2018#5]Parametriziran相关推荐

  1. COCI 2018/2019 CONTEST #2 T4 Maja T5Sunčanje Solution

    COCI 2018/2019 CONTEST #2 T4 T5 Solution abstract 花式暴力 #2 T5 Sunčanje 题意 按顺序给你1e5个长方形(左下角坐标&& ...

  2. 【COCI 2018/2019 Round #2】Kocka

    这道题也是一个ex的模拟题 不过他比Zamjena可爱 作为一个帅气的小哥哥,让我们一起, 开启你的模拟ex大门,C++从入门到放弃! 题目 题目描述 我又来了!我又来了! 在清晨来到儿童游乐园的时候 ...

  3. COCI 2018/2019 CONTEST #2 Solution

    Problem1 Preokret 第一题一定不是什么难题. 第一个问题在读入的时候判断当前时间是不是在1440及以前就行 第二个问题考虑离线处理,由于每个时刻只能最多发生1个事件那么就弄个桶记录每一 ...

  4. 「COCI 2018.10.20」Teoretičar

    题目链接 如果知道 X X X 可能有一些网络流的做法,但是在此题中网络流也显得不够高效.设最大度数为 D D D,可以构造找到一个 X = 2 ⌈ log ⁡ 2 D ⌉ X=2^{\lceil \ ...

  5. 回顾 2018,展望 2019

    1. 概述 今天是 2019 年第一天,趁着元旦 3 天假期时间,对即将过去的这一年做个总结回顾,看下这一年得到了什么,失去了什么,并对来年做个新的规划,看下需要采取哪些措施提升自己. 2. 2018 ...

  6. 2017 年总结及 2018 年计划

    概述 本文写于 2018.01.01,计划从 2017 开始有目的的进行复盘行动,所以将该文搬运到此处. ----------------------------分界线---------------- ...

  7. 2018 Google kickstart Problem A. Planet Distance

    题目描述 Small dataset 3 ≤ N ≤ 30. Large dataset 3 ≤ N ≤ 1000.input 2 5 1 2 2 3 3 4 2 4 5 3 3 1 2 3 2 1 ...

  8. 2018年终总结:自由而独立

    时间真快,一年,走完了大三的后半学期和大四的前半学期. 这一年经历了很多事情,第一次这么久没有回家. 收获: 计算机进度: 一年的时间从VB版机房系统到现在的JS 其实,并没有很快很扎实连贯的走进度, ...

  9. VLOG丨树莓派Raspberry Pi 3安装PLEX并挂载USB硬盘打造最牛的微型家庭影音服务器2018...

    视频介绍 树莓派3安装目前最流行的PLEX服务器,实现既能最大限度降低功耗,也能随时随地观看分享影片. 一.在树莓派下安装PLEX媒体服务器 1.在终端,将你的树莓派更新至最新 sudo apt up ...

最新文章

  1. 剑指offer:面试题09. 用两个栈实现队列
  2. 104.路由协议有哪些?
  3. javascript 中 split 函数分割字符串成数组
  4. 小米bl未解锁变砖了如何刷机_如何安装MIUI 10
  5. 我可以在输入字段上使用:before或:after伪元素吗?
  6. Spark Streaming处理File Streams
  7. 机器学习、深度学习教程和代码资源帖
  8. python入门经典-终于明白经典python入门教程
  9. jsp 与html 如何结合使用方法,jsp中如何写javascript?
  10. wsimport 的使用
  11. 自主导航:赋予移动机器人智能感知与运动的能力
  12. Java注解中produces啥意思_SpringBoot常用注解
  13. Excel 2010 SQL应用117 分组统计之GROUP BY 与First
  14. android充电指示灯颜色修改
  15. Laravel使用swagger PHP生成api接口文档
  16. Golang位运算符
  17. Python案例:围棋的状态数
  18. R语言使用ARIMA模型预测股票收益时间序列
  19. Android 11.0 根据包名授予WRITE_SETTINGS权限
  20. 【实战篇】基于Pytorch的3D立体图像分类--基础篇

热门文章

  1. 电子计算机制作探测,如何自己制作一个简易的金属探测器
  2. 鸿蒙思维和小央美,北市场附近艺术培训
  3. oracle unpivot 空值,sql – 处理UNPIVOT中的NULL值
  4. java接口那一节是哪的知识_Java中的接口知识汇总
  5. linq查询不包含某个值的记录_【翻译】C#表达式中的动态查询
  6. java打包拆包_[Java] Java 打包成jar包 和 解压jar包
  7. c++游戏代码大全_还在学少儿编程?不如来玩工厂编程师,免费学编程逻辑的小游戏...
  8. 计算机科普小知识——Win7系统32位与64位的区别,该如何选择?
  9. [Redis6]Redis相关知识介绍
  10. 今年暑假不AC-贪心