Codeforces - 1703D

原题链接

题目:

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代码:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CodeForces - 616D是一个关于找到一个序列中最长的第k好子段的起始位置和结束位置的问题。给定一个长度为n的序列和一个整数k,需要找到一个子段,该子段中不超过k个不同的数字。题目要求输出这个序列最长的第k好子段的起始位置和终止位置。 解决这个问题的方法有两种。第一种方法是使用尺取算法,通过维护一个滑动窗口来记录\[l,r\]中不同数的个数。每次如果这个数小于k,就将r向右移动一位;如果已经大于k,则将l向右移动一位,直到个数不大于k。每次更新完r之后,判断r-l+1是否比已有答案更优来更新答案。这种方法的时间复杂度为O(n)。 第二种方法是使用枚举r和双指针的方法。通过维护一个最小的l,满足\[l,r\]最多只有k种数。使用一个map来判断数的种类。遍历序列,如果当前数字在map中不存在,则将种类数sum加一;如果sum大于k,则将l向右移动一位,直到sum不大于k。每次更新完r之后,判断i-l+1是否大于等于y-x+1来更新答案。这种方法的时间复杂度为O(n)。 以上是两种解决CodeForces - 616D问题的方法。具体的代码实现可以参考引用\[1\]和引用\[2\]中的代码。 #### 引用[.reference_title] - *1* [CodeForces 616 D. Longest k-Good Segment(尺取)](https://blog.csdn.net/V5ZSQ/article/details/50750827)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [Codeforces616 D. Longest k-Good Segment(双指针+map)](https://blog.csdn.net/weixin_44178736/article/details/114328999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值