[Educational Codeforces Round 81 (Rated for Div. 2) C. Obtain The String(序列自动机,贪心)
C. Obtain The String
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
You are given two strings ss and tt consisting of lowercase Latin letters. Also you have a string zz which is initially empty. You want string zz to be equal to string tt. You can perform the following operation to achieve this: append any subsequence of ss at the end of string zz. A subsequence is a sequence that can be derived from the given sequence by deleting zero or more elements without changing the order of the remaining elements. For example, if z=acz=ac, s=abcdes=abcde, you may turn zz into following strings in one operation:
- z=acacez=acace (if we choose subsequence aceace);
- z=acbcdz=acbcd (if we choose subsequence bcdbcd);
- z=acbcez=acbce (if we choose subsequence bcebce).
Note that after this operation string ss doesn't change.
Calculate the minimum number of such operations to turn string zz into string tt.
Input
The first line contains the integer TT (1≤T≤1001≤T≤100) — the number of test cases.
The first line of each testcase contains one string ss (1≤|s|≤1051≤|s|≤105) consisting of lowercase Latin letters.
The second line of each testcase contains one string tt (1≤|t|≤1051≤|t|≤105) consisting of lowercase Latin letters.
It is guaranteed that the total length of all strings ss and tt in the input does not exceed 2⋅1052⋅105.
Output
For each testcase, print one integer — the minimum number of operations to turn string zz into string tt. If it's impossible print −1−1.
Example
input
Copy
3
aabce
ace
abacaba
aax
ty
yyt
output
Copy
1
-1
3
题意:
t组数据,每一组数据含有一个字符串t和一个字符串s。
x初始为空字符串,每一次操作可以在字符串x后面加一个s的子序列,问最少需要多少次操作可以使x等于t。
思路:
先标记字符串s中出现过哪些字符,然后如果有t中出现的字符,但是s中没有出现,答案就是-1,即不可能。
然后通过dp的思想构建出序列自动机,就是一个数组\(next[i][j]\) 代表第i位之后最近的j字符的位置。
然后通过贪心的思想即得出答案
过程为:
初始答案值ans为1,让字符串t通过数组next去匹配s,失配后ans加一,匹配的位置设为0。
代码:
#include
#include
#include
#include
#include
#include
#include
#include