【POJ 2503】 Babelfish

【题目链接】

           http://poj.org/problem?id=2503

【算法】

           字符串哈希

【代码】

            

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
#define MAXN 100010
typedef unsigned long long ULL;
const int P = 13331;
const int MOD = 1e5 + 7;

int i,tot,t;
ULL f[15];
char s[15],s1[MAXN][15];
int nxt[MAXN],Head[MOD],d[MAXN];
char english[MAXN][15];
char tmp;

inline ULL get(char *s)
{
        int i;
        ULL ret = 0;
        for (i = 0; i < strlen(s); i++) ret = ret * P + (s[i] - 'a' + 1);
        return ret;
}
inline void Insert(ULL x,int p)
{
        int pos = (int)(x % MOD);
        tot++;
        nxt[tot] = Head[pos];
        d[tot] = p;
        Head[pos] = tot;        
}
inline void query(char *s)
{
        int i;
        ULL Hash = get(s);
        int pos = (int)(Hash % MOD);
        for (i = Head[pos]; i; i = nxt[i])
        {
                if (strcmp(s,s1[d[i]]) == 0) 
                {
                        printf("%s
",english[d[i]]);
                        return;        
                }        
        }        
        printf("eh
");
}

int main() 
{
        
        f[0] = 1;
        for (i = 1; i <= 12; i++) f[i] = f[i-1] * P;        
        while (true)
        {
                t++;
                if (t == 1) scanf("%s%s",&english[t],&s1[t]);
                else
                {
                        english[t][0] = tmp;
                        scanf("%s%s",&s,&s1[t]);
                        for (i = 0; i < strlen(s); i++) english[t][i+1] = s[i];
                }
                Insert(get(s1[t]),t);
                getchar();
                tmp = getchar();
                if (tmp == '
') break;
        }
        while (scanf("%s",&s) != EOF) query(s);    
        
        return 0;
    
}
原文地址:https://www.cnblogs.com/evenbao/p/9248322.html