NYOJ 2356: 哈希計劃【模擬】
阿新 • • 發佈:2017-09-02
++ 需要 學會 ont lld asa color 滿足 上一個
題目描述
眾所周知,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 #defineLL 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: 哈希計劃【模擬】