Example
input
3
5
abab
ab
abc
abacb
c
3
x
xx
xxx
8
codeforc
es
codes
cod
forc
forces
e
code
output
10100
011
10100101
题目分析
本题给定多组数据,其中每组数据中包括若干个字符串(每个字符串长度较短,不超过8个),判断每组数据中的每一个字符串是否能够通过另外两个字符串相加得到,这两个字符串可以为相同字符串,若可以,则输出 1 ,反之,输出 0
具体实现
本题因测试数据较大,需要压缩和优化时间复杂度,在判断字符串是否满足条件的时候,不能只是进行简单的拼接判断,而是选择时间复杂度更低的拆分,将每个字符串拆分为前后两部分,判断输入的字符串之中,是否有这两个拆分后的字符串,若都有,则输出 1 ,反之,输出 0
AC代码及注释
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
const int N = 1e5 + 10;
string str[N];
map<string , int> mp;
int main()
{
int t;
cin >> t; //输入测试数据的组数
int n;
while(t --)
{
mp.clear(); //每次循环清空 map 内的数据
cin >> n;
int flag = 0;
for(int i = 0 ; i < n ; i ++)
{
cin >> str[i];
mp[str[i]] = 1; //用 map 记录每个输入的字符串
}
for(int i = 0 ; i < n ; i ++)
{
flag = 0;
for(int j = 0 ; j < str[i].size() ; j ++) //将每个字符串拆解为两部分
{
string a = str[i].substr(0 , j + 1); //字符串 a = 该字符串前半部分
string b = str[i].substr(j + 1 , str[i].size() - j - 1); // b = 后半部分
if(mp[a] == 1 && mp[b] == 1) flag = 1; //判断 map 中是否记录了 a 和 b
}
if(flag == 1) cout << '1';
else cout << '0';
}
cout << endl;
}
return 0;
}