1. 程式人生 > >NYOJ 2356 哈希計劃(模擬)

NYOJ 2356 哈希計劃(模擬)

std 提示 ret 我們 scanf 個數 輸入 return ...

題目鏈接:

http://acm.nyist.me/JudgeOnline/problem.php?id=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

提示

來源

河南省多校臉萌第六場

解題思路:

仔細按照題目模擬即可。

AC代碼:

 1 #include<stdio.h>
 2
#include<string.h> 3 char a[10010]; 4 int main() 5 { 6 int b[26],i,l,m,j; 7 long long ans1,ans2; 8 while(scanf("%s",a) != EOF) 9 { 10 l=strlen(a); 11 12 memset(b,0,sizeof(b)); 13 for(i=0;i<l;i++) 14 b[a[i]-a]++; 15 for(j=0,m=0
,i=0;i<26;i++) 16 { 17 if(b[i] > j) 18 { 19 j=b[i]; 20 m=i;//找到出現次數最多的字母 21 } 22 } 23 24 ans1 = a[0]-a+97; 25 for(i=1;i<l;i++)//按題意模擬 26 { 27 ans1 = (a[i-1]-a+97) ^ (a[i]-a+97); 28 if(i==1) 29 ans2 = ans1; 30 else 31 { 32 ans2 *= ans1; 33 ans2 %= (m+97); 34 } 35 } 36 printf("%lld\n",ans2); 37 } 38 return 0; 39 }

NYOJ 2356 哈希計劃(模擬)