[교육 라운드 Codeforces 81 (사업부 정격. 2) C. 문자열 구하는 (서열 오토마타 욕심)
C.는 문자열을 얻어서
테스트 당 시간 제한
1 초
시험 당 메모리 제한
256메가바이트
입력
표준 입력
산출
표준 출력
당신은 라틴 소문자로 구성된 두 개의 문자열의 SS 및 TT 부여됩니다. 또한 당신은 처음에 비어있는 문자열 ZZ 있습니다. 당신은 문자열 ZZ는 문자열 TT 동일하게합니다. 이 작업을 달성하기 위해 다음과 같은 작업을 수행 할 수 있습니다 : 문자열 ZZ의 끝에서 SS의 서브 순서를 추가합니다. 서브 순서 나머지 요소들의 순서를 변경하지 않고 0 또는 그 이상의 요소를 삭제하여 지정된 시퀀스로부터 유도 될 수있는 서열이다. 예를 들어, Z = ACZ = AC, S = abcdes = ABCDE, 당신은 하나의 작업에서 다음과 같은 문자열로 ZZ 회전 수 :
- Z = acacez = acace (우리 aceace 서브 시퀀스를 선택하는 경우);
- Z = acbcdz = acbcd (우리 bcdbcd 서브 시퀀스를 선택하는 경우);
- Z = acbcez = acbce (우리는 서브 시퀀스 bcebce를 선택하는 경우).
참고이 작업 문자열 SS가 변경되지 않는 한 후 그.
문자열 TT에 문자열 ZZ를 설정하는 등의 작업의 최소 수를 계산합니다.
입력
테스트 케이스의 수 - 첫 번째 줄은 정수 TT (1≤T≤1001≤T≤100)가 포함되어 있습니다.
라틴 소문자로 구성된 각 테스트 케이스의 첫 번째 줄은 하나 개의 문자열 SS (≤105 |에요 | ≤1051≤ | |이야 1≤)가 포함되어 있습니다.
각 테스트 케이스의 두 번째 줄은 하나의 문자열 TT를 포함 (1≤ | t | ≤1051≤ | t | ≤105) 라틴 소문자로 구성.
입력의 모든 문자열 SS와 TT의 총 길이는 2⋅1052⋅105를 초과하지 않도록 보장한다.
산출
각 테스트 케이스를 들어, 하나 개의 정수를 인쇄 - 작업의 최소 수는 문자열 TT에 문자열 ZZ를 켭니다. 그것은 불가능 인쇄의 경우 -1-1.
예
입력
부
3
aabce
ace
abacaba
aax
ty
yyt
산출
부
1
-1
3
질문의 의미 :
데이터 세트 t, 문자열을 포함하는 데이터의 각 세트의 스트링 t.
X는 처음에, 각각의 작업이 많은 작업은 X의 최소 t 동일 요구하는 방법을 물어 문자열 X의 시퀀스의 뒤쪽에 추가 할 수 있습니다 빈 문자열입니다.
아이디어 :
첫 번째 문자열이 문자가 나타나있는이야, 다음 t에 표시 문자가있는 경우,이야하지만 표시되지 않습니다 표시, 대답은 -1 불가능하다.
생각이어서 DP 오토 마톤의 시퀀스로 구성되어 배열이다 (다음 [I] [J] \) \ i 번째 비트 후 가까운 문자의 위치 J.
그리고 그 욕심 생각하여 대답은
프로세스는 다음과 같습니다
스트링의 배열이 다음 제로로 설정 불일치 ANS, 매칭 위치를 추가 한 후, S t가 일치하도록 ANS 않음 초기 값은 1이다.
코드 :
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
#define du3(a,b,c) scanf("%d %d %d",&(a),&(b),&(c))
#define du2(a,b) scanf("%d %d",&(a),&(b))
#define du1(a) scanf("%d",&(a));
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) { if (a == 0ll) {return 0ll;} a %= MOD; ll ans = 1; while (b) {if (b & 1) {ans = ans * a % MOD;} a = a * a % MOD; b >>= 1;} return ans;}
void Pv(const vector<int> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%d", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}
void Pvl(const vector<ll> &V) {int Len = sz(V); for (int i = 0; i < Len; ++i) {printf("%lld", V[i] ); if (i != Len - 1) {printf(" ");} else {printf("\n");}}}
inline long long readll() {long long tmp = 0, fh = 1; char c = getchar(); while (c < '0' || c > '9') {if (c == '-') fh = -1; c = getchar();} while (c >= '0' && c <= '9') tmp = tmp * 10 + c - 48, c = getchar(); return tmp * fh;}
inline int readint() {int tmp = 0, fh = 1; char c = getchar(); while (c < '0' || c > '9') {if (c == '-') fh = -1; c = getchar();} while (c >= '0' && c <= '9') tmp = tmp * 10 + c - 48, c = getchar(); return tmp * fh;}
const int maxn = 1000010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int nxt[maxn][30];
char s[maxn];
int len;
int len2;
void init()
{
for (int i = len; i >= 1; --i)
{
repd(j, 0, 25)
{
nxt[i - 1][j] = nxt[i][j];
}
nxt[i - 1][s[i] - 'a'] = i;
}
}
char t[maxn];
bool vis[maxn];
int a[maxn];
void clear_()
{
for (int i = len; i >= 1; --i)
{
for (int j = 0; j <= 25; ++j)
{
nxt[i - 1][j] = 0;
}
}
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
int q;
q = readint();
while (q--)
{
// MS0(nxt);
scanf("%s", s + 1);
len = strlen(s + 1);
init();
repd(i, 'a', 'z')
{
vis[i] = 0;
}
repd(i, 1, len)
{
vis[s[i]] = 1;
}
scanf("%s", t + 1 );
len2 = strlen(t + 1);
int isok = 1;
repd(i, 1, len2)
{
if (!vis[t[i]])
{
isok = 0;
break;
}
}
if (!isok)
{
printf("-1\n");
continue;
}
int ans = 1;
for (int now = 0, i = 1; i <= len2; ++i)
{
now = nxt[now][t[i] - 'a'];
if (!now)
{
now = nxt[0][t[i] - 'a'];
ans++;
}
}
printf("%d\n", ans );
clear_();
}
return 0;
}