哈希在ACM中题目的应用(不断收集中~)

1、HDU 1496

题意:输入abcd ,问满足方程 a*xi^2 + b*xj^2 =-1*( c*xk^2 + d*xt^2) 。 的解 xi(1,2,3,4) -->[-100 , 100]

思路:暴力做法就是四重循环, 用哈希,把等号左边的值套入哈希数组, 等号右边进行判断对应的哈希数组值就行,o(n^2);

还要注意一点,数组下标不能为负,因此生产下标时统统哈希为 t+1000000

code:

#include 
//#include 
#include 
#include 
using namespace std;
int num[105];
int hash1[2000003];

int main()
{
    int a,b,c,d;
    for(int i=1; i<=100; i++)
    {
        num[i] = i*i;
    }
    while(scanf("%d%d%d%d",&a,&b,&c,&d) != EOF)
    {
        if(a>0 && b>0 &&c>0 &&d>0 || a<0 &&b<0 &&c<0 &&d<0)
        {
            printf("0\n");
            continue;
        }
        //cout<<"here"<

2、HDU-1425

题意:输入n个数,输出前m大的那几个数

思路:快排的话o(nlog(n)) , 若卡时间则不行,可用空间换时间。

具体做法:

while(n--)
{
    int t;
    scanf("%d",t);
    hash1[t+500000]++;
}

for(int i=500000*2;i>=0;i--)
{
    if(hash1[i] != 0)
    {
        m--;
        cout<

3、HDU-1800

题意:输入n个字符串,问相同的字符串的个数

思路:map飘过,正解是字符串哈希。str[0] * base^n-1 + str[1] * base^n-2 + .... + str[n-1]

类比数字1234  = 1*1000+2*100+3*10+4

这里拓展下0x3F3F3F3F 和0x7FFFFFFF

0X7FFFFFFF 是INT_MAX ,再加1 就溢出成负数,因此不用于运算,不过longlong的取模要用这个

0x3f3f3f3f 达到了1e9 ,作为inf 运算不会溢出为负数。

#include 
//#include 
#include 
#include 
#include 
#include 
#include 


using namespace std;
typedef long long ll;
char st[50];
int Hash[3005];

int hashit(char *st)
{
    ll base = 131;
    ll tmp = 0;
    while(*st == '0') // 前导0去掉
        st++;
    while(*st)
    {
        tmp = tmp*base + (*st++);
    }
    return (tmp & 0x7FFFFFFF); // 对INT最大值取模
}

int main()
{
    int n;
    while(scanf("%d",&n) !=EOF)
    {
        
        for(int i=0; ians)
                    ans=temp;
            }
            else
                temp=1;
        }
        printf("%d\n",ans);
    }
    
    
    return 0;
}
//很不错的字符串哈希函数
unsigned int ELFhash(char *str)
{
	unsigned int hash=0;
	unsigned int x=0;
	while(*str)
	{
		hash=(hash<<4)+*str;     //1
		if((x=hash & 0xf0000000)!=0)         //2
		{
			hash^=(x>>24);   //影响5-8位,杂糅一次   3
			hash&=~x;   //清空高四位    4
		}
		str++;   //5
	}
	return (hash & 0x7fffffff);    //6 
}

 

你可能感兴趣的:(算法)