不是凭什么我F复杂度正确然后被卡常啊
  • 板块灌水区
  • 楼主_determination_
  • 当前回复11
  • 已保存回复13
  • 发布时间2024/3/23 22:15
  • 上次更新2024/3/24 11:24:56
查看原帖
不是凭什么我F复杂度正确然后被卡常啊
530468
_determination_楼主2024/3/23 22:15

复杂度 O(log⁡2sn×t)O(\log^2 sn\times 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;
}
2024/3/23 22:15
加载中...