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)