problem:https://www.acwing.com/problem/content/1462/
前提是证明区间有二段性
在该问题中假设最小的k值为ans,则需证明i>=ans的字符串长度两两都不相等,i<ans长度的字符串至少有两个相等;
(1):当i>=ans是必有一个长度为ans的前缀字符串,因为ans两两不相等所以长度为i的字符串两两不相等
(2):当i<ans时,因为ans时满足条件的最小值,所以更小的就不满足条件
代码:
#include<iostream>
#include <cstring>
#include <algorithm>
#include <unordered_set>
using namespace std;
int n;
string s;
bool check(int x){
unordered_set<string> hash;
for(int i=0;i<=n-x;++i){
string tmp=s.substr(i,x);
if(hash.count(tmp))return false;
hash.insert(tmp);
}
return true;
}
int main(){
cin>>n>>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<<endl;
return 0;
}