C - Obtain The String 序列自动机

Posted qq2210446939

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C - Obtain The String 序列自动机相关的知识,希望对你有一定的参考价值。

传送门:https://vjudge.net/contest/361562#problem/C

题意

  多组样例,给你一个串s和串t还有一个空串x,要求往x里添加s的子序列,使x变为t,求添加次数。

思路

  使用序列自动机狗仔串s的nxt数组,把整个t串进行匹配,当失配的时候,把前面已经匹配成功的部分当成一次子序列的添加,再从当前失配位置从头匹配,如果还是匹配失败则无法完成输出-1.

AC代码

#include<iostream>
#include<string.h>
using namespace std;
const int maxn=1e5+5;
const int inf=0x3f3f3f3f;
int T,ans,flag;
char s[maxn],t[maxn];
int nxt[maxn][27];
void init(char *s){
    int len=strlen(s);
    for(int i=0;i<26;i++) nxt[len][i]=inf;
    for(int i=len-1;i>=0;i--){
        for(int j=0;j<26;j++){
            nxt[i][j]=nxt[i+1][j];
        }
        nxt[i][s[i]-a]=i+1;
    }
}
bool find(char *t){
    int len=strlen(t);
    int pos=-1;
    for(int i=0;i<len;i++){
        pos=nxt[pos+1][t[i]-a];
        if(pos==inf) return 0;
    }
    return 1;
}
int main()
{
    cin>>T;
    while(T    --){
        cin>>s>>t;
        ans=1;flag=1;
        init(s);
        int lent=strlen(t),pos=0;
        for(int i=0;i<lent;i++){
            int k=t[i]-a;
            if(nxt[pos][k]==inf){
                ans++;
                pos=0;
                if(nxt[pos][k]==inf){
                    flag=0;break;
                }
                pos=nxt[pos][k];
            }
            else{
                pos=nxt[pos][k];
            }
        }
        if(flag)
            cout<<ans<<
;
        else
            cout<<-1<<
;
    }
    return 0;
}

 

以上是关于C - Obtain The String 序列自动机的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 1295C - Obtain The String

Obtain The String CodeForces - 1295C

Codeforces 1295C Obtain The String (二分)

Codeforces Round #526 C - The Fair Nut and String /// 组合递推

vmwareconverter 5.5 standalone 迁移 Unable to obtain hardware information for the selected machine

MATLAB读视频报错 Unable to initialize the video obtain properties (videoreader in Matlab)