NYOJ 2356: 哈希计划模拟
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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; }
以上是关于NYOJ 2356: 哈希计划模拟的主要内容,如果未能解决你的问题,请参考以下文章