蓝桥杯每日一题第三天

27 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情

1460. 我在哪?

分析

今天这题可以算是这三天最简单的一题了,我甚至感觉这题都不用二分,暴力就能过了,果真暴力过得去,我真的感觉这题数据范围应该扩大,QAQ,真就随便写这题,暴力的复杂度是O(n2)O(n^2),二分的时间复杂度是O(n2logn)O(n^2logn),在这题数据看来没有任何区别,可以把数据范围扩大到10000感觉,就是用一个mapmap维护一下看最后这个字符串出现的次数是不是正好等于nmid+1n-mid+1。真的没啥好说的,看看两个代码

暴力代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll qmi(ll x,ll y,int mod){
    ll res=1;
    while(y){if(y&1)res=res*x%mod;y>>=1;x=x*x%mod;}
    return res;
}
int n;
string s;
map<string,int> mp;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    cin>>s;
    for(int len=1;len<=n;len++){
        mp.clear();
        for(int i=0;i<=s.size()-len;i++){
            string ss=s.substr(i,len);
            mp[ss]++;
        }
        if(mp.size()==n-len+1){
            cout<<len<<"\n";
            break;
        } 
    }
    return 0;
}

二分代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){
    return y?gcd(y,x%y):x;
}
ll qmi(ll x,ll y,int mod){
    ll res=1;
    while(y){
        if(y&1) res=res*x%mod;
        y>>=1;
        x=x*x%mod;
    }
    return res;
}
int n;
string s;
map<string,int> mp;
bool check(int mid){
    mp.clear();
    for(int i=0;i<=s.size()-mid;i++){
        string ss=s.substr(i,mid);
        mp[ss]++;
    }
    if(mp.size()==n-mid+1) return true;
    else return false;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin>>n;
    cin>>s;
    int l=1,r=n;
    while(l<r){
        int mid=l+r>>1;
        if(check(mid)) r=mid;
        else l=mid+1;
    }
    cout<<l<<"\n";
    return 0;
}

就没啥好说的吧。