uva 188 - Perfect Hash

点击打开链接

题目意思: 说这个题目之前先让我喷喷,太尼玛恶心了一道水题装B 的好像很有技术含量,真的是恶心。

                   题目给定一个字符串。每一个字符串由多个单词组成,现在有一个计算法则“ a = 1 , b = 2 ...... z = 26   ,‘a’ = 1 , “bz” = 26*32^0 + 2*32^1 = 90 类似32进制的转换” 然后要求我们去求出每一单词的值w ,排序满足 W1<W2<.......<Wn.

                    现在要求我么能否找到一个整数C ,使得:1 对于所以的Wi,Wj而言都有 C/WI % n  !=  C/Wj % n;2 并且C是所以Wi中至少一个的倍数  3 如果有出现C/WI % n  =  C/Wj % n  时候就要令 C = Min( (C/WI+1) * Wi , (C/Wj+1) * Wj ); 直到求出最小的C

解题思路:  我么初始化C = 1 ;然后去做循环判断,由于要比较要两重循环,只要我们判断到  C/WI % n  =  C/Wj % n 我么就要去递归进行下一轮的判断,如果当找到C后就不会去 递归返回的时候直接return即可。对于单个字符提取,可以用split函数

代码:

//分割字符串我们使用split函数
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
#define MAXN 10000

char ch[MAXN] , Ch[MAXN];
int  w[20];
int  C , k;

//求出最小值
inline int Min(int a , int b){
    return a < b ? a : b;
}

//判断求最小C
void solve() {
    for (int i = 0 ; i < k ; i++) {
        for (int j = i + 1 ; j < k ; j++) {
            if ((C/w[i])%k == (C/w[j])%k){
                C = Min((C/w[i]+1)*w[i] , (C/w[j]+1)*w[j]);
                solve();//递归
                return;//递归回来后说明找到了C则直接退出
            }
        }
    }
}

//主函数
int main() {
    //freopen("input.txt" , "r" , stdin);
    int i , t;
    while (gets(ch)) {
        memcpy(Ch , ch , sizeof(ch));
        memset(w, 0, sizeof (w));
        const char* split = " " ; char *p;
        p = strtok(ch, split);
        int len = strlen(p);
        for (k = 0,i = 0; i < len; i++) {
            t = p[i] - 'a' + 1;
            w[k] += t * pow(32, len - 1 - i);
        }
        k++;
        while (p != NULL) {
            p = strtok(NULL, split);
            if (p == NULL) break;
            int len = strlen(p);
            for (i = 0; i < len; i++) {
                t = p[i] - 'a' + 1;
                w[k] += t * pow(32, len - 1 - i);
            }
            k++;
        }
        sort(w, w + k);
        C = 1 ; solve();//C初始化为1,不为0即可
        printf("%s\n" , Ch);
        printf("%d\n\n" , C);
    }
    return 0;
}
时间: 2025-01-11 12:18:07

uva 188 - Perfect Hash的相关文章

uva 188 - Perfect Hash 模拟

       这题只要读懂题就等于没难度了,完全照着题目给的公式模拟即可      要注意的就是末尾的多余空格.   /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #inc

UVa 188:Perfect Hash

题目链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=124 类型: 哈希 原题: Perfect Software, Inc. has obtained a government contract to examine text flowing through a high-speed network

uva 704 - Colour Hash map+双向bfs

     这题从上周日开始想写的,结果拖了一周--现在写题效率越来越低了,要计时训练了.      一道很复杂的隐式图搜索--状态数有24位,看到网上有人按11进制转换,然后对Hash_MAX取模,个人认为这种做法不靠谱.于是把状态变成string类型的,直接用map,对于map,24位的string效率还是非常高的.     搜索的时候双向bfs,因为比较懒,所以把反向和正向写一起了,其实逆向只用做一次就可以了.     还有一点要注意的就是要输出数字最小的一种变换序号,这个处理方法就是把一层

Java数组到HashMap之算法解释

一.数组是什么? 忘了在哪本书里曾看到过类似这样的一句话"所有的数据结构都是数组的演化",想想其实是有道理的,因为计算机的内存其实就是线性的存储空间. Java示例代码: int[] array = new int[5] 忽略对象头信息和数组长度信息,JVM执行时会在堆中分配20个字节的内存空间,看起来就是这样的: 这样的数据结构可以很方便地通过数组下标存取数据,但在查找时需要遍历数组,平均时间复杂度为O(n/2). 当数据量很大或者查找操作频繁的时候,这样的遍历操作几乎是不可接受的.

MG--查询

查询 就是如何利用建好的索引来找到想要的文本,那么会介绍两种查询,一种是布尔查询(Boolean Query),另一种是排名查询(Ranked Query).布尔查询 包含了一个术语列表,这些术语通过布尔操作符相连(and,or,not),查询的答案是满足规定条件的文档. 布尔查询的缺点是会不可避免的返回很多无关的答案,而且查询一些小的变动会导致结果完全不同.因为布尔查询是机械的,必须精确匹配布尔表达式的文档才是候选结果. 如'data AND compression' 和 'text AND

UVa 704:Colour Hash, 双向bfs

链接: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=110&page=show_problem&problem=645 类型:隐式图搜索,双向bfs 原题: This puzzle consists of two wheels. Both wheels can rotate both clock and counter-clockwise. They contai

uva 141 The Spot Game hash

  很简单的hash,可以知道只需要保存每行每列的总个数即可唯一确定图,所以只需开两个50的数组即可,然后对最长为100的字符串进行hash,一开始想直接ELF,但后来发现还是有重复,懒得写拉链法了,直接用map,0.008s就过了 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostre

算法题:UVA 10604 (记忆化搜索 + hash)

In a chemist's lab, there are several types of chemicals in tubes. The chemist wants to mix all these chemicals together, two chemicals at a time. Whenever two chemicals are mixed, some heat is generated and released into the air and the mixed chemic

uva 10591 - Happy Number hash

   非常简单的题,易知平方和后不超过800,开个800的数组,预处理,然后直接定址就可以了,不过要注意a和an的区别 /* author:jxy lang:C/C++ university:China,Xidian University **If you need to reprint,please indicate the source** */ #include <iostream> #include <cstdio> #include <cstdlib> #in