• POJ 3274 HASH


    题目链接:http://poj.org/problem?id=3274

    题意+思路: 点击这里

    补充:因为有减法运算,所以可能会造成运算后结果为负数,所以需要把结果统一转换成正数[不然数组下标访问不到负数位置],还有要先把0放入哈希表,不然会出现长度为1但是没有匹配的情况

    比如:1 3

         7

    结果为1,如果没把0放进哈希表则结果为0

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cstdio>
    #include<vector>
    #include<cmath>
    #include<time.h>
    using namespace std;
    typedef long long int LL;
    const int MAXN=100000+5;
    const int MAXK=30+5;
    const int MOD=999991;
    int Num[MAXN][MAXK]; //data storage
    struct Node{
        int id,Next; 
    }Cow[MAXN];
    int n,k,S[MAXN][MAXK];
    int Scnt,Head[MOD];//hash table
    void Init(){ //initialization
        memset(Head,-1,sizeof(Head));
        memset(S,0,sizeof(S));
        Scnt=0;
    }
    void AddNode(int HashN,int idx){ 
        Cow[Scnt].id=idx;
        Cow[Scnt].Next=Head[HashN];
        Head[HashN]=Scnt++;
    }
    bool cmp(int idx,int idy){ //compare two array
        for(int i=0;i<k;i++){
            if(S[idx][i]!=S[idy][i]){
                return false;
            }
        }
        return true;
    }
    int solve(){ 
        int ans=0;
        for(int i=0;i<=n;i++){ //insert 0 into the hash table first!
            int HashNum=0; //i==0 then insert 0 into the hash table because Data from 1 to n
            for(int j=0;j<k;j++){
                HashNum=((HashNum+S[i][j])+MOD)%MOD;
            }
            for(int j=Head[HashNum];j!=-1;j=Cow[j].Next){
                if(cmp(i,j)){
                    ans=max(ans,i-j);
                }
            }
            AddNode(HashNum,i); 
        }
        return ans;
    }
    void make_S(){//make array S
        for(int i=1;i<=n;i++){
            for(int j=0;j<k;j++){
                S[i][j]=S[i-1][j]+Num[i][j];
            }
        }
    }
    void make_C(){ //make array C
        for(int j=k-1;j>=0;j--){
            for(int i=1;i<=n;i++){
                S[i][j]-=S[i][0];
            }
        }
    }
    int main(){
    #ifdef kirito
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
        int start=clock();
        while(~scanf("%d%d",&n,&k)){
            Init(); 
            for(int i=1;i<=n;i++){
                int val;
                scanf("%d",&val);
                for(int j=0;j<k;j++,val/=2){
                    Num[i][j]=val%2;
                }
            }
            make_S(); make_C();
            printf("%d
    ",solve());
        }
    #ifdef LOCAL_TIME
        cout << "[Finished in " << clock() - start << " ms]" << endl;
    #endif
        return 0;
    }
  • 相关阅读:
    Encryption (hard) CodeForces
    cf 1163D Mysterious Code (字符串, dp)
    AC日记——大整数的因子 openjudge 1.6 13
    AC日记——计算2的N次方 openjudge 1.6 12
    Ac日记——大整数减法 openjudge 1.6 11
    AC日记——大整数加法 openjudge 1.6 10
    AC日记——组合数问题 落谷 P2822 noip2016day2T1
    AC日记——向量点积计算 openjudge 1.6 09
    AC日记——石头剪刀布 openjudge 1.6 08
    AC日记——有趣的跳跃 openjudge 1.6 07
  • 原文地址:https://www.cnblogs.com/kirito520/p/5664789.html
Copyright © 2020-2023  润新知