简单说就是一个长度为偶数的字符串 W 可以分为两部分 U 和 V ,如果 V 是 U 旋转得到的,那么 W 就是双旋转性的。
关于字符串的题目就是拼理解力,题目有点难理解。
正片开始
给定两个字符串集合 S 和 T,S 中的字符串长度为 N,T 中的字符串长度为 M ,且 N + M 是偶数。需要找出 S 和 T 中字符串对 (Si, Tj),使得 Si + Tj 满足双旋转性。
首先,N + M 是偶数,所以 Si + Tj 的总长度是偶数,可以分为两部分,每部分长度为 \displaystyle \frac{N+M}{2}。
正常的话其实可以暴力枚举。
但是时间复杂度 O(TotalS TotalT (N + M)),包超时的呀。
这种题目就只能用哈希解决了,我只会哈希解,太弱了,如果有更好的题解请大佬指教。
具体步骤
1.读取输入参数: TotalS, TotalT, N, M。
2.读取 TotalS 个字符串,存储在数组S中。
3.读取 TotalT 个字符串,存储在数组T中。
4.计算 L = \displaystyle \frac{N+M}{2}。
5.初始化一个字典 map,键是字符串的最小表示,值是拥有该最小表示的 Si 的数量。
6.对于每个 Si in S:
7.对于每个 Tj in T:
8.构造 W = Si + Tj。
9.提取 U = W[0...L-1]。
10.计算 U 的最小表示 minU 。
11.将 minU 在 map 中对应的计数加 1。
12.初始化结果计数器 count = 0 。
13.对于每个 Tj in T:
14.构造 V = W[L...2L-1]。
15.计算 V 的最小表示 minV 。
16.如果 minV 在 map 中存在,将 count 加上 map[minV] 。
17.输出 count 。
但是还是会 TLE。
优化
注意到 U 和 V 分别来自 Si 和 Tj,且 W = Si + Tj。
所以, U 是 W 的前 L 个字符, V 是后 L 个字符。
由于 W = Si + Tj,所以 U 是由 Si 的前 L - M 个字符和 Tj 的前 M - (L - N) 个字符组成。