题目链接:
https://codeforces.com/contest/1703/problem/D
题目
给你长度最多为 8的 n个字符串 s1,s2,…,sn。
对于每个字符串 si,判断是否存在两个字符串 sj和 sk,使得 si=sj+sk。也就是说,si是sj和sk的串联。注意,j可以等于 k。
回顾一下,字符串s和t的连接为s+t=s1s2…spt1t2…tq,其中p和q分别是字符串s和t的长度。例如,"code "和 "force "的连接为 "codeforces"。
输入
第一行包含一个整数 t(1≤t≤104)--测试用例数。
每个测试用例的第一行包含一个整数 n (1≤n≤105)--字符串的个数。
然后是n行,其中第i行包含长度至多为88的非空字符串si,由小写英文字母组成。在给定的 n个字符串中,可能有相同(重复)的字符串。
所有测试案例中的n之和不超过105105。
输出
对于每个测试用例,输出长度为 n的二进制字符串。如果存在两个字符串 sj和 sk,其中 si=sj+sk的 i 位应该是 1,否则是 00。注意,j可以等于k。
注
在第一个测试案例中,我们有以下内容:
- s1=s2+s2,因为 abab=ab+ab。请记住,j可以等于k。
- s2不是列表中任何两个字符串的连接。
- s3=s2+s5,因为 abc=ab+c.
- s4不是列表中任意两个字符串的连接。
- s5不是列表中任何两个字符串的连接。
由于只有s1和s3满足条件,答案中只有第一位和第三位应该是1,所以答案是10100。
思想:把最后连接成的长字符串拆开,然后从中间某个位置开始遍历两边的字符串,然后看两个字符串是否都在所给的短字符串中,如果两个都成立,那么输出true。
第二种思路:利用count函数和substr函数,思想和第一种差不多
// Problem: D. Double Strings
// Contest: Codeforces - Codeforces Round 806 (Div. 4)
// URL: https://codeforces.com/contest/1703/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5+5;
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T;
cin>>T;
while(T--){
int n;
cin>>n;
vector<string> a(n+1);
map<string,bool> mp;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]=true;
}
string ans="";
for(int i=1;i<=n;i++){
string t=a[i];
bool flag=false;
for(int j=0;j<t.size();j++){
string b="",c="";
for(int k=0;k<j;k++){
b+=t[k];
}
for(int k=j;k<t.size();k++){
c+=t[k];
}
if(mp[b]&&mp[c]){
flag=true;
ans+='1';
break;
}
}
if(flag==false){
ans+='0';
}
}
cout<<ans<<"\n";
}
return 0;
}
注意:vector<string> a(n+1)改为string a[N],会导致超时,不知道为什么
第二种方法:
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int tt;
cin >> tt;
while (tt--) {
int n;
cin >> n;
vector<string> a(n);
map<string, int> mp;
for (int i = 0; i < n; i++) {
cin >> a[i];
mp[a[i]]++;
}
string ans;
for (int i = 0; i < n; i++) {
bool ok = false;
for (int j = 0; j < int(a[i].size()); j++) {
if (mp.count(a[i].substr(0, j)) && mp.count(a[i].substr(j))) {
ok = true;
}
}
if (ok) {
ans += '1';
} else {
ans += '0';
}
}
cout << ans << '\n';
}
return 0;
}