您的位置:首页 > 大数据 > 人工智能

csu 2014 summer trainning day 1 哈希

2014-07-18 09:32 239 查看
POJ1200

题意:给定串s,串中不同字符数nc,所求子串长度n,求长度为n的不同的子串的个数

分析:处理长度很短的字符串哈希,数据保证可以无冲突存储下来,利用hash思想快速查询以前便利的结果,关键在于优化搜索。

code:

#include<iostream>
#include<queue>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<vector>
#defineMod49999

usingnamespacestd;
structNode{
intadd,a1,a2;
};
vector<Node>G[Mod+100];
voidinit(){
for(inti=0;i<Mod+10;i++)G[i].clear();
}
voidInsert(intk,intb1,intb2){
intkey=k;
while(key<0)key=key+Mod;
key=key%Mod;
inti;
for(i=0;i<G[key].size();i++){
intadd=G[key][i].add;
inta1=G[key][i].a1;
inta2=G[key][i].a2;
if(add==k&&(a1+a2==b1+b2)&&(a1-a2==b1-b2))break;
}
if(i==G[key].size())G[key].push_back(Node{k,b1,b2});
return;
}
boolSearch(intd,intc){
intkey=d-c;
while(key<0)key=key+Mod;
key=key%Mod;
inti;
for(i=0;i<G[key].size();i++){
intadd=G[key][i].add;
inta1=G[key][i].a1;
inta2=G[key][i].a2;
if(add==d-c&&a1!=d&&a2!=d&&a1!=c&&a2!=c)returntrue;
}
returnfalse;
}
inta[1010];
intn;
intmain(){
while(~scanf("%d",&n)&&n){
init();
for(inti=0;i<n;i++)scanf("%d",&a[i]);
for(inti=0;i<n-1;i++){
for(intj=i+1;j<n;j++){
Insert(a[i]+a[j],a[i],a[j]);
}
}
intm=-536870913;
for(inti=0;i<n-1;i++){
for(intj=i+1;j<n;j++){
if(Search(a[i],a[j]))m=max(m,a[i]);
if(Search(a[j],a[i]))m=max(m,a[j]);
}
}
if(m==-536870913)puts("nosolution");
elseprintf("%d\n",m);
}
return0;
}


ViewCode

列出一些Hash要用到的素数:

prime=997,prime=1999,prime=7993,prime=9973,prime=29989,prime=49999,prime=99991


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐