1039: 重复子序列问题
重复子序列的时候,判断now是否回到起点,来确定重复了几次,使用了序列自动机
#include <bits/stdc++.h>
using namespace std;
const int N =100000+10;
char a[N],b[N];
int next1[N][26];
int main(){
while(scanf("%s %s",a+1,b+1)!=EOF){
int la=strlen(a+1);
int lb=strlen(b+1);
for(int i=0;i<26;i++)
next1[la+1][i]=0;
for(int i=la; i>0; i--){
for(int j=0;j<26;j++)
{ next1[i][j]=next1[i+1][j];
if(a[i]-'a'==j){
next1[i][j]=i;
}
}
}
int ans=1;
int now=1;
for(int i =1 ;i<=lb;i++){
if(next1[now][b[i]-'a']>0){
now=next1[now][b[i]-'a']+1;
}
else if(next1[1][b[i]-'a']){
now= next1[1][b[i]-'a'] +1;
ans++;
}
else {
printf("-1\n");
break;
}
if(i==lb){
printf("%d\n",ans);
}
}
}
return 0;
}

浙公网安备 33010602011771号