日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hyperset(排序+二分)

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hyperset(排序+二分) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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(排序+二分)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。