CodeForces-1287B Hyperset(stl)

stl
题目意思:
有 n个字符串,每个字符串长度 为k。 每个字符 只有三种形式 ‘E’, ‘T’, ‘S’。
现在问, 从 n 个字符串,选出三个, 使得这三个字符串满足以下条件:
相同位置的字符,要么相等,要么互补相等。
比如这三个字符串,“SETT”, “TEST”, “EEET”, 每个字符串都有4位。
第 0 位, 互补相等
第 1 位, 相等, 都是 ‘E’
第 2 位, 互补相等
第 3 位, 相等, 都是 ‘T’

本题要点:
1、首先,从 n个字符串选出两个 字符串,第三个字符串是唯一确定的。 先把原来的字符串每位字符
转为 ‘1’, ‘2’, ‘3’。 change[‘E’ + 0] = ‘1’, change[‘S’ + 0] = ‘2’, change[‘T’ + 0] = ‘3’;
2、如果前面两个字符是 EE , 第三个必然是 E; 前面两个字符是 ES , 第三个必然是 T;
如果前面两个字符是 ET , 第三个必然是 S; 前面两个字符是 SS , 第三个必然是 S;
以此类推
3、第三个字符 tmp 串确定后,在 set 中查找,

if(st.find(tmp) != st.end())
{
	++ans;
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <set>
#include <string>
#include <vector>
using namespace std;
int n, k;
char change[256];
string s[1510];
set<string> st;

char need_char(char ch)
{
	if(ch == '2' || ch == '5')
	{
		return '1';
	}
	if(ch == '3' || ch == '6')
	{
		return '3';
	}
	if(ch == '4')
	{
		return '2';
	}
	return '1';
}

void solve()
{
	int ans = 0;
	char str[40] = {0};
	for(int i = 0; i < n; ++i)
	{
		for(int j = i + 1; j < n; ++j)
		{
			for(int x = 0; x < k; ++x)
			{
				char ch = s[i][x] + s[j][x] - '0';
				str[x] = need_char(ch);	
			}
			string tmp(str);
			if(st.find(tmp) != st.end())
			{
				++ans;
			}
		}
	}
	printf("%d\n", ans / 3);
}

int main()
{
	change['E' + 0] = '1', change['S' + 0] = '2', change['T' + 0] = '3';
	cin >> n >> k;
	for(int i = 0; i < n; ++i)
	{
		cin >> s[i];
		for(int j = 0; j < k; ++j)
		{
			s[i][j] = change[0 + s[i][j]];

		}
		st.insert(s[i]);
	}
	solve();
	return 0;
}

/*
5 4
SETT
TEST
EEET
ESTE
STES
*/

/*
2
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值