错了handmade3求助
查看原帖
错了handmade3求助
1028042
Jason_Harry_Song楼主2024/3/24 11:03
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n=0;
string s="",t="";
string fs2="";
vector<int>apr[26]={};
int ls=0,lt=0,lf=0,cnt[26]={};
int calc(int a,int b,char c);
bool judge(int num);
signed main(){
	cin>>n>>s>>t;
	fs2=" "+s+s;
	ls=s.size();
	lt=t.size();
	lf=ls*2;
	s=" "+s;
	t=" "+t;
	for(int i=1;i<=lf;i++){
		apr[fs2[i]-'a'].push_back(i);
	}
	for(int i=1;i<=ls;i++){
		cnt[s[i]-'a']++;
	}
	int l=0,r=1e17+1;
	while(l+1<r){
		int mid=(l+r)/2;
		if(judge(mid)==true){
			l=mid;
		}else{
			r=mid;
		}
	}
	cout<<l<<endl;
	return 0;
}
int calc(int a,int b,char c){
	if(cnt[c-'a']==0){
		return-1;
	}
	if(b>cnt[c-'a']){
		int nb=b%cnt[c-'a'];
		if(nb==0){
			nb=cnt[c-'a'];
		}
		return calc(a+(b-nb)/cnt[c-'a']*ls,nb,c);
	}
	if(a>ls){
		int na=a%ls;
		if(na==0){
			na=ls;
		}
		return calc(na,b,c)+a-na;
	}
	int l=0,r=apr[c-'a'].size()+1;
	while(l+1<r){
		int mid=(l+r)/2;
		if(apr[c-'a'][mid-1]<=a){
			l=mid;
		}else{
			r=mid;
		}
	}
	return apr[c-'a'][r+b-2];
}
bool judge(int num){
	int ans=0;
	for(int i=1;i<=lt;i++){
		int cc=calc(ans,num,t[i]);
		if(cc==-1){
			return false;
		}
		ans=cc;
		if(ans>n*ls){
			return false;
		}
	}
	return true;
}
2024/3/24 11:03
加载中...