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;
}
posted @ 2026-02-26 01:03  peter_shen  阅读(7)  评论(0)    收藏  举报