算法-散列表

题目一:

 解题思路:

拉链法:p表示哈希表头,e表示结点值,ne模拟指针,idex表示存储下标

#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+3;
int p[N],e[N],ne[N];
int idex;

void  insert(int x)
{
    int k=(x%N+N)%N;
    e[idex]=x;
    ne[idex]=p[k];
    p[k]=idex;
    idex++;
}

bool find(int x)
{
    int k=(x%N+N)%N;
    for(int i=p[k];i!=-1;i=ne[i])
        if(e[i]==x)return true;
    return false;
}

int main()
{
    int n;
    memset(p,-1,sizeof p);
    scanf("%d",&n);
    while(n--)
    {
        char t;
        int x;
        cin>>t>>x;
        if(t=='I')
        {
            insert(x);
        }
        else{
            if(find(x))printf("Yes\n");
            else printf("No\n");
        }
    }
    return 0;
}

题目二 字符串哈希

解题思路 

时间换空间,模仿十进制的拆分

字符串哈希详解icon-default.png?t=N7T8https://blog.csdn.net/Mikchy/article/details/103995537?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522169381144516800225536295%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=169381144516800225536295&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-103995537-null-null.142%5Ev93%5EchatsearchT3_1&utm_term=%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%93%88%E5%B8%8C&spm=1018.2226.3001.4187

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+10,P=131;
typedef unsigned long long ULL;
char str[N];
int n,m;
ULL h[N], p[N];

ULL find(int l,int r)
{
    return h[r]-h[l-1]*p[r-l+1];//此处p[...]表示为位数
}

int main()
{

    scanf("%d%d",&n,&m);
    scanf("%s",str+1);
    p[0]=1;
    for(int i=1;i<=n;i++)
    {
        h[i]=h[i-1]*P+str[i];
        p[i]=p[i-1]*P;
    }
    
    while(m--)
    {
        int l1,r1,l2,r2;
        cin>>l1>>r1>>l2>>r2;
        if(find(l1,r1)==find(l2,r2))
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
    return 0;
    
}

猜你喜欢

转载自blog.csdn.net/xx_xb/article/details/132666320