교육 Codeforces 라운드 81 (사업부 정격. 2) C. 문자열을 얻습니다 (시퀀스 오토마타를, 욕심)

[교육 라운드 Codeforces 81 (사업부 정격. 2) C. 문자열 구하는 (서열 오토마타 욕심)

C.는 문자열을 얻어서

테스트 당 시간 제한

1 초

시험 당 메모리 제한

256메가바이트

입력

표준 입력

산출

표준 출력

당신은 라틴 소문자로 구성된 두 개의 문자열의 SS 및 TT 부여됩니다. 또한 당신은 처음에 비어있는 문자열 ZZ 있습니다. 당신은 문자열 ZZ는 문자열 TT 동일하게합니다. 이 작업을 달성하기 위해 다음과 같은 작업을 수행 할 수 있습니다 : 문자열 ZZ의 끝에서 SS의 서브 순서를 추가합니다. 서브 순서 나머지 요소들의 순서를 변경하지 않고 0 또는 그 이상의 요소를 삭제하여 지정된 시퀀스로부터 유도 될 수있는 서열이다. 예를 들어, Z = ACZ = AC, S = abcdes = ABCDE, 당신은 하나의 작업에서 다음과 같은 문자열로 ZZ 회전 수 :

  1. Z = acacez = acace (우리 aceace 서브 시퀀스를 선택하는 경우);
  2. Z = acbcdz = acbcd (우리 bcdbcd 서브 시퀀스를 선택하는 경우);
  3. 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;
}


추천

출처www.cnblogs.com/qieqiemin/p/12244355.html