复杂度 O(log2sn×t),其中s代表s的长度,t同理。算他60*60*1e5 哪也只是3.6e8 3s绰绰有余,而且我加了一些小优化根本跑不满
如果有大佬看出我的复杂度算错了赶紧喷我这个sb,如果我复杂度没算错跪求卡常。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
// #define endl '\n'
#define debug cout << "114514" << endl
int n;
string s,t;
int sum[100010][30];
int calc(int x,int f)
{
int k=x/s.size();
x%=s.size();
return sum[s.size()][f]*k+sum[x][f];
}
int check(int x)
{
int f=1;
for ( int i = 0 ; i < t.size() ; i++ )
{
int g=calc(f-1,t[i]-'a');
if(calc(s.size()*n,t[i]-'a')-g<x)return 0;
int l=f,r=s.size()*n;
while(l<r)
{
int mid=(l+r)/2;
if(calc(mid,t[i]-'a')-g<x)
{
l=mid+1;
}else{
r=mid;
}
}
f=l+1;
}
return 1;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n >> s >> t;
for ( int i = 1 ; i <= s.size() ; i++ )
{
for ( int j = 0 ; j < 26 ; j++ )
{
sum[i][j]=sum[i-1][j];
}
sum[i][s[i-1]-'a']++;
}
int l=0,r=(s.size()*n)/t.size();
while(l<r)
{
int mid=(l+r+1)/2;
if(check(mid))
{
l=mid;
}else{
r=mid-1;
}
}
cout << l;
return 0;
}