哈希表

unordered_map<int, int> hashtable;

关键功能在于能够快速查找

两数之和

题意:在数组中找出两个数的和等于给定的一定目标值

这题暴力可以,数据很小,主要想学习一下哈希表的做法。

哈希表做法:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        unordered_map<int, int> hashtable;
        for (int i = 0; i < nums.size(); ++i) {
            auto it = hashtable.find(target - nums[i]);
            if (it != hashtable.end()) {
                return {it->second, i};
            }
            hashtable[nums[i]] = i;
        }
        return {};
    }
};
//将查找这一步由O(n)降低到了O(1),利用哈希表可以快速查找的特点。

字符串哈希

题意:给一个字符串,给两个区间问两个区间内的字符串是否相等;

思路:字符串哈希,哈希值一样则相等。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
#define sc(n) scanf("%d",&n)
#define print(n) printf("%d\n",n)
#define endl "\n";
#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)
const int N=1000010,P=131;
const int MOD = 1e9 + 7;
const int INF=1e9;
const double eps=1e-5;

int n,m;
int a[N],b[N];
ull h[N],p[N];

ull get(int l,int r){
    return h[r]-h[l-1]*p[r-l+1];
}
char s[N*2];
int main(){
    cin>>n>>m;

    cin>>s+1;
    //s=" "+s;
    p[0]=1;
    for(int i=1;i<=n;i++){
        h[i]=h[i-1]*P+s[i];
        p[i]=p[i-1]*P;
    }

    while(m--){
        int l1,l2,r1,r2;
        cin>>l1>>r1>>l2>>r2;
        //cout<<get(l1,r1)<<" "<<get(l1,r2)<<endl;
        if(get(l1,r1)==get(l2,r2)) puts("Yes");
        else puts("No");
    }
    return 0;
}
/*
5
55 30 5 4 2
100 20 10 10 5
*/
算法专题 文章被收录于专栏

怕忘记,好复习

全部评论

相关推荐

07-14 12:22
门头沟学院 Java
点赞 评论 收藏
分享
昨天 14:55
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务