acwing 我在哪?(字符串哈希)

原题链接

image

题解

分析

  • 设答案为ans,那么大于ans,肯定不成立,小于ans成立,这符合二分答案的特点
  • 然后使用unordered_set和substr进行查重
  • substr:第一个参数为开始项,第二个参数为要截取的长度

代码

#include "iostream"
#include "string"
#include "unordered_set"
using namespace std;

int n;
string str;
bool check(int mid){
    unordered_set<string>hash;
    for(int i=0;i+mid<=n;i++){
        string s=str.substr(i,mid);
        if(hash.count(s))return false;
        hash.insert(s);
    }
    return true;
}
int main(){
    cin>>n>>str;
    int l=1,r=n;
    while (l<r){
        int mid=(l+r)>>1;
        if(check(mid))r=mid;
        else l=mid+1;
    }
    cout<<r;
}
posted @ 2023-02-15 22:09  Cheng_Mao  阅读(21)  评论(0编辑  收藏  举报