[codeforces 1287B] Hyperset 字符串+排序+二分
总目录详见https://blog.csdn.net/mrcrack/article/details/103564004
在线测评地址https://codeforces.com/contest/1287/problem/B
Problem | Lang | Verdict | Time | Memory |
---|---|---|---|---|
B - Hyperset | GNU C++11 | Accepted | 529 ms | 0 KB |
思考过程如图所示
基本思路:枚举2个字串,算出符合条件的第3个字串。3个字串上同一位置的规律应满足上图条件。算出的第3个字串,在原数据中进行二分查找,若找到,则组合书加1。
注意,1,2,3串;运算过程为1,2,3; 1,3,2; 2,3,1;故最后结果别忘了除3. 2019-1-6 9:47
#include <stdio.h>
#include <string.h>
int n,k,tot;
char s[1510][35],t[35];
int c2i(char c){
if(c=='E')return 1;
else if(c=='S')return 2;
else if(c=='T')return 3;
}
int main(){
int i,j,a,b,c,p;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)scanf("%s",s[i]);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++)
if(strcmp(s[i],s[j])>0)
strcpy(t,s[i]),strcpy(s[i],s[j]),strcpy(s[j],t);
for(i=1;i<=n;i++)
for(j=i+1;j<=n;j++){
for(p=0;p<k;p++){
a=c2i(s[i][p]),b=c2i(s[j][p]);
c=a+b;
if(c==2||c==5)t[p]='E';
else if(c==4)t[p]='S';
else if(c==3||c==6)t[p]='T';
}
t[k]='\0';
int left=1,right=n+1,mid;
while(left+1<right){
mid=(left+right)/2;
if(strcmp(s[mid],t)>0)right=mid;
else left=mid;
}
if(strcmp(s[left],t)==0)tot++;
}
printf("%d\n",tot/3);
return 0;
}