。。。

导航

NYOJ 2356: 哈希计划【模拟】

题目描述

众所周知,LLM的算法之所以菜,就是因为成天打游戏,最近LLM突然想玩《金庸群侠传X》,结果进去后各种被虐,LLM就开始研究这个游戏的代码,顺便还学会了一点点点点lua语言,然后就开始了伟大的改游戏代码之旅,然后LLM发现自己too young了,这个游戏把所有的文本都进行了哈希,如果自己改了代码或者剧情文本的话它哈希出来的值就会和原来的哈希值不一样......然后游戏就会打不开.....,现在LLM发现了文本的哈希函数,要求你写个程序,功能为:

输入一段字符串,输出一个哈希值

为了简化这个问题,我们假设游戏的哈希方法是:

从第二个字符开始每个字符都对应其ACISS码的值,然后异或上一个字符的ACISS码值,然后所有的异或值相乘取余字符串中出现最多的那个字符的ACISS码值(如果有多个,则选取ACISS码最小的那个)

输入

每个测试文件不多于100组测试样例

输入包含一个只有小写字母的字符串s,

2<=s<=10000

输出

输出仅一个数字,代表答案

样例输入

asd
as
asadf

样例输出

26
18
39

思路:模拟题。不过需要注意的地方是更新出现次数最多的ascii码值,判断条件应该先满足出现次数最多,然后才是次数相同时,ascii码值较小。上次有道搜索题自己就是错在这里,不长记性。
#include<stdio.h>
#include<string.h>
#define N 10010
#define inf 0x3f3f3f3f
#define LL long long
char s[N];
LL ans,maxtime,mod,time[N],num[N];
int main()
{
    int i;
    while(scanf("%s",s)!=EOF)
    {
        memset(time,0,sizeof(time));
        memset(num,0,sizeof(num));
        maxtime  = -inf;
        mod  = inf;
        for(i = 0; s[i]!='\0'; i ++)
        {
            time[s[i]]++;//记录每个ascii码出现的次数 
            if(time[s[i]] > maxtime||time[s[i]]==maxtime&&mod>s[i])//每次记录比较小的ascii码值 
            {
                mod = s[i];
                maxtime = time[s[i]];
            }
            if(i)//取1及其以后的异或值 
                num[i] = s[i]^s[i-1];
        }
        ans = 1;
        for(i = 1; s[i]!='\0'; i ++)
            ans= num[i]*ans%mod;
        printf("%lld\n",ans);
    }
    return 0;
}

 

posted on 2017-09-01 22:31  大学僧  阅读(143)  评论(0编辑  收藏  举报