开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情
分析
今天这题可以算是这三天最简单的一题了,我甚至感觉这题都不用二分,暴力就能过了,果真暴力过得去,我真的感觉这题数据范围应该扩大,QAQ,真就随便写这题,暴力的复杂度是,二分的时间复杂度是,在这题数据看来没有任何区别,可以把数据范围扩大到10000感觉,就是用一个维护一下看最后这个字符串出现的次数是不是正好等于。真的没啥好说的,看看两个代码
暴力代码
#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;
}
就没啥好说的吧。