代码 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;
}