题目:
You are given nn strings s1,s2,…,sns1,s2,…,sn of length at most 88.
For each string sisi, determine if there exist two strings sjsj and sksk such that si=sj+sksi=sj+sk. That is, sisi is the concatenation of sjsj and sksk. Note that jj can be equal to kk.
Recall that the concatenation of strings ss and tt is s+t=s1s2…spt1t2…tqs+t=s1s2…spt1t2…tq, where pp and qq are the lengths of strings ss and tt respectively. For example, concatenation of "code" and "forces" is "codeforces".
Input
The first line contains a single integer tt (1≤t≤104) — the number of test cases.
The first line of each test case contains a single integer nn (1≤n≤105) — the number of strings.
Then nn lines follow, the ii-th of which contains non-empty string sisi of length at most 8, consisting of lowercase English letters. Among the given nn strings, there may be equal (duplicates).
The sum of nn over all test cases doesn't exceed 105.
Output
For each test case, output a binary string of length nn. The ii-th bit should be 11 if there exist two strings sjsj and sksk where si=sj+sksi=sj+sk, and 00 otherwise. Note that jj can be equal to kk.
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
Note:
In the first test case, we have the following:
s1=s2+s2s1=s2+s2, since abab=ab+ababab=ab+ab. Remember that jj can be equal to kk.
s2s2 is not the concatenation of any two strings in the list.
s3=s2+s5s3=s2+s5, since abc=ab+cabc=ab+c.
s4s4 is not the concatenation of any two strings in the list.
s5s5 is not the concatenation of any two strings in the list.
题意:
有t组测试用例,每组测试用例中有n个字符串,判断第i个字符串是否可以用这n个中的另外两个(或者是一个字符串重复两遍)来组成。
举个栗子:样例中第一组测试用例:abab可以由第二个字符串ab重复两次组成
首先我们可能会想到的是遍历一下来求解,但这样时间复杂度为O(n3),会被TLE
不过我们可以从要判断的字符串本身来下手:
利用map的映射关系,将n个要判断的字符串都存进map中,令它们对应bool类型的值为true
先声明两个string类型的变量:a,b
令a="",b=s[i](a为空,b第i个字符串)
然后依次让a加上s[i][j++](j从0开始),让b.erase(b.begin()),删除b中的第一个字符
每次改变a,b后都利用map[a],map[b]来进行判断,如果a,b等于其他字符串那么其就为true,反之为false
AC代码:
#include<iostream>
#include<string>
#include<map>
using namespace std;
string s[100010];
map<string, bool>mp;
string a, b;
int main()
{
int t;
cin >> t;
int i, j;
int n;
bool flage = true;
while (t--)
{
cin >> n;
mp.clear();
for (i = 0; i < n; i++)
{
cin >> s[i];
mp[s[i]] = true;
}
for (i = 0; i < n; i++)
{
a = "", b = s[i];
flage = true;
for (j = 0; j < s[i].size(); j++)
{
a += s[i][j];
b.erase(b.begin());
if (mp[a] && mp[b])
{
cout << 1;
flage = false;
break;
}
}
if (flage)
{
cout << 0;
}
}
cout << endl;
}
return 0;
}