求卡常
查看原帖
求卡常
760998
rhn7楼主2024/3/24 12:33
#include<bits/stdc++.h>
#define rd(x) scanf("%lld",&x)
using namespace std;
typedef long long ll;
const ll N=1e5+5;
ll n,m,pre[N][26];
string s,t;
ll cal(ll x,ll ch){return pre[m][ch]*(x/m)+pre[x%m][ch];}
bool chk(ll x){
	ll p=1;
	for(ll i=0;i<t.size();i++){
		ll l=p-1,r=n*m,ans=-1;
		while(l<=r){
			ll mid=(l+r)>>1;
			if(cal(mid,t[i]-'a')-cal(p-1,t[i]-'a')>=x) ans=mid,r=mid-1;
			else l=mid+1;
		}
		if(ans==-1) return 0;
		p=ans+1;
	}
	return 1;
} 
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>s>>t;
	m=s.size();s=" "+s;
	for(ll i=1;i<=m;i++){
		for(ll j=0;j<26;j++) pre[i][j]=pre[i-1][j]+(s[i]-'a'==j);
	}
	ll l=0,r=n*m,ans=-1;
	while(l<=r){
		ll mid=(l+r)>>1;
		if(chk(mid)) ans=mid,l=mid+1;
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}

两只log的做法,AC×44,TLE×6

2024/3/24 12:33
加载中...