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
*/