UVA 12706 Zero-Knowledge Protocol 亂搞

題意: T組數據,每組數據給出n個數字形成s串,給出m個數字,對這m個數字全排列,每一種排列方式可形成p串.找到p串在s串中匹配的位置,取第一個數字在s中的下標,對所有的下標平方求和.
思路:給出m個數字的全排列是不可能枚舉的,那麼只要記錄p串中不同數字,及其出現次數.(map可以做到).直接暴力是不可能的.
m1記錄p串中數字的情況,m2記錄p中沒有,s中有的數字.

初始diff_m1=m1.size(),diff_m2=0;
先確定s串前m個,兩種情況:
1.在p中出現過,那麼從p對應的map(記作m1)裏面減,若是m1[s[i]]==0.diff_m1- -;
2.未在p中出現過,那麼在另外一個map(記作m2)裏面加,該m2記錄p中沒有,當前長度爲m的s子串中有的數字.
之後就是枚舉i 1->n-m+1,將前一個數字從m1中還原,也是兩種情況:
1.在p中出現過,在m1里加.
2.未在p中出現,那麼必定在m2裏面已經記錄,只要減去就好.
將新加進來的數字根據前面的兩種情況來加入m1,還是m2.

最後判定是否匹配的條件即是:diff_m1==0&&diff_m2==0.

因爲是先確定s串前m個,所以m>n的情況,明顯是不對的.加個特判,或者每次清空數組即可.

This Code

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章