Bees Alice and Alesya gave beekeeper Polina famous card game “Set” as a Christmas present. The deck consists of cards that vary in four features across three options for each kind of feature: number of shapes, shape, shading, and color. In this game, some combinations of three cards are said to make up a set. For every feature — color, number, shape, and shading — the three cards must display that feature as either all the same, or pairwise different. The picture below shows how sets look.

Polina came up with a new game called “Hyperset”. In her game, there are nn cards with kk features, each feature has three possible values: “S”, “E”, or “T”. The original “Set” game can be viewed as “Hyperset” with k=4k=4.

Similarly to the original game, three cards form a set, if all features are the same for all cards or are pairwise different. The goal of the game is to compute the number of ways to choose three cards that form a set.

Unfortunately, winter holidays have come to an end, and it’s time for Polina to go to school. Help Polina find the number of sets among the cards lying on the table.

Input
The first line of each test contains two integers nn and kk (1≤n≤15001≤n≤1500, 1≤k≤301≤k≤30) — number of cards and number of features.

Each of the following nn lines contains a card description: a string consisting of kk letters “S”, “E”, “T”. The ii-th character of this string decribes the ii-th feature of that card. All cards are distinct.

Output
Output a single integer — the number of ways to choose three cards that form a set.

Examples
Input
3 3
SET
ETS
TSE
Output
1
Input
3 4
SETE
ETSE
TSES
Output
0
Input
5 4
SETT
TEST
EEET
ESTE
STES
Output
2
Note
In the third example test, these two triples of cards are sets:

“SETT”, “TEST”, “EEET”
“TEST”, “ESTE”, “STES”

很久没有做算法题了,这个题不算难,但是还是手生。
首先容易想到的是O(n^3)的算法,但是一定会超时。因此我们可以固定两个,根据两个字符串找出另一个字符串,然后判断另外一个字符串有没有出现。这样时间复杂度就降到了O(n ^ 2),但是一开始用的map超时了,stl毕竟耗时大。我们可以事先对字符串排个序,这样就可以二分来找那个字符串。但是不能用SET了,要转化成对应的1,2,3。这样异或起来,如果是0的话,就是原来的数字,如果不是0的话,这样就是异或之后的那个数字。排序之后二分,就可以判断那个数字有没有存在了。除此之外,最后的结果要除以三才是最终的答案,因为一样的式子,我们找了三遍。
代码如下:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;const int maxx=1e4+100;
string s[maxx];
int n,m;inline string fcs(string a,string b)
{string c="";int x,y;for(int i=0;i<m;i++){x=a[i]-'0';y=b[i]-'0';if((x^y)==0) c+=(x+'0');else c+=((x^y)+'0');}return c;
}
int main()
{scanf("%d%d",&n,&m);int cnt=0;for(int i=0;i<n;i++){cin>>s[i];string a="";for(int j=0;j<m;j++){if(s[i][j]=='S') a+='1';else if(s[i][j]=='E') a+='2';else a+='3';    }s[i]=a;}int ans=0;sort(s,s+n);//for(int i=0;i<n;i++) cout<<s[i]<<endl;for(int i=0;i<n;i++){for(int j=i+1;j<n;j++){string t=fcs(s[i],s[j]);int l=0,r=n-1;while(l<=r){int mid=l+r>>1;if(s[mid]==t) {ans++;break;}else if(s[mid]>t) r=mid-1;else l=mid+1;}}}printf("%d\n",ans/3);return 0;
}

努力加油a啊,(o)/~

Hyperset(排序+二分)相关推荐

  1. 51Nod-1090 3个数和为0【排序+二分查找】

    1090 3个数和为0 基准时间限制:1秒 空间限制:131072KB 分值:5难度:1级算法题 给出一个长度为N的无序数组,数组中的元素为整数,有正有负包括0,并互不相等.从中找出所有和 = 0的3 ...

  2. 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]

    题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...

  3. [排序][二分][dp]JZOJ 2747 捡金子

    Description 从前有一个迷宫,迷宫的外形就像一棵带根树,每个结点(除了叶子结点外)恰好有K个儿子. 一开始你在根结点,根结点的K个儿子分别标记为'A', 'B', 'C'-.,而结点'A'的 ...

  4. [蓝桥杯][2015年第六届真题]密文搜索(排序+二分)

    题目描述 福尔摩斯从X星收到一份资料,全部是小写字母组成. 他的助手提供了另一份资料:许多长度为8的密码列表. 福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的. 请你编写一个程序,从第一份资料 ...

  5. P3573-[POI2014]RAJ-Rally【拓扑排序,二分+树状数组】

    正题 题目链接:https://www.luogu.com.cn/problem/P3573 题目大意 nnn个点mmm条边的DAGDAGDAG,删掉一个点使得最长路最短. 解题思路 先跑一遍拓扑排序 ...

  6. LeetCode LCP 28. 采购方案(排序 + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 小力将 N 个零件的报价存于数组 nums. 小力预算为 target,假定小力仅购买两个零件,要求购买零件的花费不超过预算,请问他有多少种采购方案. 注 ...

  7. LeetCode 1498. 满足条件的子序列数目(排序+二分查找+快速幂)

    1. 题目 给你一个整数数组 nums 和一个整数 target . 请你统计并返回 nums 中能满足其最小元素与最大元素的 和 小于或等于 target 的 非空 子序列的数目. 由于答案可能很大 ...

  8. JSK-353 求同存异【暴力+排序+二分】

    求同存异 输入两个数组(数组元素个数为 6 和 8),输出在两个数组中都出现的元素如 a[6]={2,3,4,5,6,7},b[8]={3,5,7,9,11,13,15,19},则输出 3,5,7. ...

  9. 51Nod-1001 数组中和等于K的数对【排序+二分查找】

    1001 数组中和等于K的数对 基准时间限制:1秒 空间限制:131072KB 分值:5难度:1级算法题 给出一个整数K和一个无序数组A,A的元素为N个互不相同的整数,找出数组A中所有和等于K的数对. ...

  10. 【数据结构与算法】task3 排序二分查找

    排序 参考:https://github.com/wangzheng0822/algo/tree/master/python 归并排序 def merge_sort(a):_merge_sort_be ...

最新文章

  1. 僵尸网络中区块链的利用方法分析
  2. 基本概念之运算符与表达式
  3. 大学医用计算机答案,医学文献检索试题(含答案)
  4. 作为大数据和云计算学习的一个序吧
  5. HTTP 协议 Host 请求头的作用
  6. OpenGL创建一个GLFW背景红色窗口的实例
  7. [vue] 说说你对keep-alive的理解是什么?
  8. 计算正方形面积和周长_小学三年级数学下册长方形和正方形面积计算练习题(无答案)...
  9. 官宣!华为主导首个软件定义摄像机国际标准诞生
  10. python如何安装wordcloud_基于python的wordcloud库的安装方法
  11. list去除重复值的方法(面试高频)
  12. JavaScript 编码规范大全-Eslint(持续更新,欢迎关注点赞加评论)
  13. Axios插件和loading的实现
  14. 推荐一款chrome浏览器插件:视频在线实时翻译
  15. 服务器系统怎么刻录光盘,怎么刻录Win7系统盘?Win7系统盘刻录教程
  16. APP抓包工具——Fiddler
  17. mysql lpad_MySQL LPAD字符串填充函数使用简介说明
  18. C语言——解数独程序[源码]
  19. 投稿论文图片分辨率达不到要求的解决方案
  20. 美国 普渡 计算机科学本科,美国大学本科普渡大学CS怎么样?

热门文章

  1. python编程菱形_Python打印“菱形”星号代码方法
  2. ⅰcp经济模型_干货!来自清华小哥哥的全家桶教程——手把手教你在本地构建 Nervos AppChain...
  3. android浮于上方布局,android-在FrameLayout中使RecyclerView上方的视图...
  4. c语言数值运算法和非数值运算法,数据结构(c语言)1.数据结构是一门研究非数值计算的程序设计问题中计算机的 以及它们之间的 _ 和运算等的学科。① A....
  5. 编写程序定义一个有 10 个 int 型元素的数组,并以其在数组中的位置作为各元素的初值。
  6. android记账本统计_记账送老婆啦!初音 蕾姆 随便挑随便选| iOS 安卓
  7. java 7.0下载_Java jre 7.0
  8. Linux就应该这么学第七课-文件的特殊权限
  9. 用nginx TCP反向代理作mail邮件代理
  10. JavaWeb学习总结(二)——JSP中的九个内置对象