求调 F(UB 代码玄关)
  • 板块学术版
  • 楼主Genius_Star
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/3/23 21:44
  • 上次更新2024/3/23 21:53:18
查看原帖
求调 F(UB 代码玄关)
979266
Genius_Star楼主2024/3/23 21:44

代码 UB 了,即样例 3 本地对的,交上去错的,瞪了半个小时都看没找到,求调。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const ll N=100100,M=27;
inline ll read(){
    ll x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){
        if(c=='-')
          f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^48);
        c=getchar();
    }
    return x*f;
}
inline void write(ll x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9)
	  write(x/10);
	putchar(x%10+'0');
}
ll n,m;
ll S[N][M];
string s,t;
bool check(ll x){
	ll h=1;
	for(auto v:t){
		ll t=h%m,p=x;
		if(S[m][v-'a']-S[t-1][v-'a']<x){
			p-=S[m][v-'a']-S[t-1][v-'a'];
			h+=(m-t);
			if(!S[m][v-'a'])
			  return 0;
			t=(p+S[m][v-'a']-1)/S[m][v-'a'];
			t--;
			h+=t*m;
			p-=t*S[m][v-'a'];
			if(!p)
			  h++;
			else{
				ll l=1,r=m,ans=m;
				while(l<=r){
					ll mid=(l+r)>>1;
					if(S[mid][v-'a']>=p){
						r=mid-1;
						ans=mid;
					}
					else
					  l=mid+1;
				}
				if(S[ans][v-'a']<p)
				  return 0;
				h+=ans+1;
			}
		}
		else{
//			cerr<<h<<'\n';
			ll l=h,r=m,ans=m;
			while(l<=r){
				ll mid=(l+r)>>1;
				if(S[mid][v-'a']-S[t-1][v-'a']>=p){
					r=mid-1;
					ans=mid;
				}
				else
				  l=mid+1;
			}
			if(S[ans][v-'a']-S[t-1][v-'a']<p)
			  return 0;
			h+=ans;			
		}
	}
	return h<=m*n;
}
int main(){
	n=read();
	cin>>s>>t;
	m=s.size();
	s=" "+s;
	for(int i=1;i<=m;i++){
		S[i][s[i]-'a']++;
		for(int j=0;j<26;j++)
		  S[i][j]+=S[i-1][j];
	}
	ll l=1,r=n,ans=0;
	while(l<=r){
		ll mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			l=mid+1;
		}
		else
		  r=mid-1;
	}
	write(ans);
	return 0;
}
2024/3/23 21:44
加载中...