zoukankan      html  css  js  c++  java
  • HDU2594 Simpsons’ Hidden Talents 字符串哈希

    最近在学习字符串的知识,在字符串上我跟大一的时候是没什么区别的,所以恶补了很多基础的算法,今天补了一下字符串哈希,看的是大一新生的课件学的,以前觉得字符串哈希无非就是跟普通的哈希没什么区别,倒也没觉得有什么特别大的用处,敲一敲才发现其实讲究还是比较多的。哈希冲突是常有的事,换一下mod,换一下进制数才有可能过,另外一种说法是用两个互质的量做hash,如果两个都相等的话那冲突就会少很多,这个倒没有做过多大的尝试,侥幸地过了一下这道题

    #pragma warning(disable:4996)
    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<algorithm>
    #define maxn 50000
    #define mod 40157
    #define xx 133
    using namespace std;
    
    char s[maxn + 50];
    char t[maxn + 50];
    
    int h1[maxn + 50];
    int h2[maxn + 50];
    int xpow[maxn+50];
    
    
    int main()
    {
    	xpow[0] = 1;
    	for (int i = 1; i <= maxn + 20; i++) 
    		xpow[i] = xpow[i - 1] * xx%mod;
    	while (~scanf("%s%s", s + 1,t + 1))
    	{
    		h1[0] = h2[0] = 0;
    		int n = strlen(s+1), m = strlen(t+1);
    		for (int i = 1; i <= n; i++) h1[i] = (h1[i - 1] * xx%mod + s[i])%mod;
    		for (int i = 1; i <= m; i++) h2[i] = (h2[i - 1] * xx%mod + t[i])%mod;
    		int ans = 0;
    		int len = min(n, m);
    		for (int i = 1; i <= len; i++){
    			int lhs = (h1[i] - h1[0] * xpow[i] % mod + mod) % mod;
    			int rhs = (h2[m] - h2[m - i] * xpow[i]% mod + mod) % mod;
    			if (lhs == rhs) ans = i;
    		}
    		if (!ans) puts("0");
    		else{
    			for (int i = 1; i <= ans; i++){
    				printf("%c", s[i]);
    			}
    			printf(" %d
    ", ans);
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Problem D: GJJ的日常之暴富梦(水题)
    Problem I: GJJ的日常之玩游戏(GDC)
    扩展欧几里得,解线性同余方程 逆元 poj1845
    poj3696 欧拉函数引用
    同余
    欧拉函数,打表求欧拉函数poj3090
    洛谷p1072 gcd,质因数分解
    gcd,lcm
    约数 求反素数bzoj1053 bzoj1257
    poj2992 阶乘分解
  • 原文地址:https://www.cnblogs.com/chanme/p/3538750.html
Copyright © 2011-2022 走看看