[UVa 12338] Anti-Rhyme Pairs (字符串哈希+二分)

原创 2016年08月30日 19:05:34

链接

UVA 12338


题意

对每个case,给出N个单词(字符串),之后有Q组询问,对每组询问(i, j),给出第i个字符串和第j个字符串的最长公共前缀长度。


思路

这是一个典型的字符串哈希问题。字符串有很好的单调性,可以使其在匹配问题上结合二分提高效率。比如本问题,找两个字符串最长公共前缀,如果前缀j匹配,那么前缀i(i < j)一定是匹配的,利用二分能很快找到最长匹配的长度。
本题做法是对每个字符串求其前缀hash数组,对每个询问二分查找即可。
代码用了自然溢出哈希,但是没有被卡掉。


代码

#include <cstdio>
#include <iostream>
#include <vector>
#include <cstring>
#include <string>
using namespace std;
typedef unsigned long long ulint;
#define maxn (1000007)
const ulint seed = 30007uLL;
const ulint mod = 1e9 + 1017uLL;
ulint Hi[maxn], Hj[maxn];

string word[maxn];
vector<ulint> H[maxn];

int solve(int i, int j)
{
    int ans = 0, l = 1, r = min(word[i].size(), word[j].size()), m;
    vector<ulint> &hi = H[i];
    vector<ulint> &hj = H[j];

    while(l <= r)
    {
        m = (l + r) >> 1;

        if(hi[m-1] == hj[m-1])
        {
            ans = m;
            l = m + 1;
        }
        else r = m - 1;
    }

    return ans;
}

int main()
{
    //freopen("12338.txt", "r", stdin);

    cin.sync_with_stdio(false);

    int T, kase = 0;
    cin >> T;
    while(T--)
    {
        printf("Case %d:\n", ++kase);

        int N;
        cin >> N;
        for(int i = 1; i <= N; i++)
        {
            cin >> word[i];
            string& s = word[i];
            vector<ulint>& h = H[i];
            h.clear();
            h.push_back(s[0] - 'a' + 1);
            for(int j = 1; j < s.size(); j++)
            {
                h.push_back(h[j-1] * seed + s[j] - 'a' + 1);
            }
        }

        int Q, i, j;
        cin >> Q;
        while(Q--)
        {
            cin >> i >> j;
            printf("%d\n", solve(i, j));
        }
    }
    return 0;
}
版权声明:想转就转吧,反正也是人人都会的东西:-(

UVA 12338 Anti-Rhyme Pairs (字符串哈希+二分)

UVA 12338 Anti-Rhyme Pairs (字符串哈希+二分)

每次询问求出两个字符串的最长公共前缀的长度 后缀数组+RMQ+lcp UVA 12338 - Anti-Rhyme Pairs

题目链接 题意:给定一些字符串,每次询问求出两个字符串的最长公共前缀的长度 思路:把字符串排序,就能求出height和rank数组,然后利用RMQ查询即可 代码: #inclu...

uva 12338 - Anti-Rhyme Pairs

Often two words that rhyme also end in the same sequence of characters. We use this property to def...

【HackerRank】Functional Palindromes(回文树+后缀数组+lcp排序+字符串哈希+二分)

【HackerRank】Functional Palindromes(回文树+后缀数组+lcp排序+字符串哈希+二分)这个页面抓不太好,大家点进去看吧~~做过的用到数据结构+算法最多的一个题……真真是...

[POJ 2774] Long Long Message (字符串哈希+二分)

链接POJ 2774题意给出两个字符串,寻找其最长公共子串。 注意字符串的长度较大,100000。思路字符串哈希典型问题,寻找N个字符串的最长公共子串。对于N个长度不超过L的字符串,哈希可以在O(N...

[POJ 1743] Musical Theme (字符串哈希+二分)

链接POJ 1743题意给出一个序列,元素范围1到88,求出最长连续子序列长度,满足该序列(或该序列的逆序)在序列中出现过至少2次并且不相交(没有公共部分)。思路又是子串+长度问题,可用哈希+二分解决...

数组、字符串、向量与哈希表

  • 2011年12月17日 15:18
  • 571KB
  • 下载

BNUOJ 34490 Justice String,字符串哈希,二分

BNUOJ 34490 Justice String 这是今年北京邀请赛的一个题目。 问串1是否有与串2“匹配”的子串。这里“匹配”是可以有最多两个字符不同的匹配。 “用两秒钟构思”,这...

字符串的哈希Key算法

  • 2011年08月08日 02:17
  • 145KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[UVa 12338] Anti-Rhyme Pairs (字符串哈希+二分)
举报原因:
原因补充:

(最多只允许输入30个字)