【BZOJ4104】解密運算 [暴力]
阿新 • • 發佈:2017-10-12
== i++ ring out solution bsp desc 字符串 splay
[Submit][Status][Discuss]
第一行有兩個整數N,M,分別表示加密前的字符串長度和字符集大小,其中字符用整數1,2,3,...,M編號,添加的特殊字符“."用0編號。
第二行為N+1個整數,表示加密後的字符串。
1 1 1 3 0 1 2 ,位置(即這個字符後面的串的排名)為第二關鍵字排序。
然後這時候權值就是矩陣的第一列。
形如:
*ABCD
-----
-----
這時第一行後面ABCD的排名,顯然就是讀入中*的位置,因為*作為ABCD*的最後一個字符。
比如ABCD*排名為x,那麽這時候 A 顯然在矩陣第一列中的第x個,輸出即可。
解密運算
Time Limit: 10 Sec Memory Limit: 512 MB[Submit][Status][Discuss]
Description
對於一個長度為N的字符串,我們在字符串的末尾添加一個特殊的字符"."。之後將字符串視為一個環,從位置1,2,3,...,N+1為起點讀出N+1個字符,就能得到N+1個字符串。
比如對於字符串“ABCAAA”,我們可以得到這N+1個串: ABCAAA. BCAAA.A CAAA.AB AAA.ABC AA.ABCA A.ABCAA .ABCAAA 接著我們對得到的這N+1個串按字典序從小到大進行排序(註意特殊字符“.”的字典序小於任何其他的字符)結果如下: .ABCAAA A.ABCAA AA.ABCA AAA.ABC ABCAAA. BCAAA.A CAAA.AB 最後,將排序好的N+1個串的最後一個字符取出,按照順序排成一個新的字符串,也就是上面這個表的最後一列,就是加密後的密文“AAAC.AB”。 請通過加密後的密文求出加密前的字符串。Input
Output
輸出僅一行,包含N個整數,用空格隔開,依次表示加密前字符串中每個字符的編號。
Sample Input
6 31 1 1 3 0 1 2
Sample Output
1 2 3 1 1 1HINT
N,M<=200000Solution
顯然,按照權值(即這個字符串首字母)為第一關鍵字
然後這時候權值就是矩陣的第一列。
形如:
*ABCD
-----
-----
這時第一行後面ABCD的排名,顯然就是讀入中*的位置,因為*作為ABCD*的最後一個字符。
比如ABCD*排名為x,那麽這時候 A 顯然在矩陣第一列中的第x個,輸出即可。
Code
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdio> 5View Code#include<cstring> 6 #include<cstdlib> 7 #include<cmath> 8 #include<queue> 9 using namespace std; 10 typedef long long s64; 11 12 const int ONE = 2e6 + 5; 13 const s64 INF = 1e18; 14 15 int n, m; 16 struct power 17 { 18 int val, pos; 19 }a[ONE]; 20 21 int get() 22 { 23 int res=1,Q=1;char c; 24 while( (c=getchar())<48 || c>57 ) 25 if(c==‘-‘)Q=-1; 26 res=c-48; 27 while( (c=getchar())>=48 && c<=57 ) 28 res=res*10+c-48; 29 return res*Q; 30 } 31 32 int cmp(const power &a, const power &b) 33 { 34 if(a.val != b.val) return a.val < b.val; 35 return a.pos < b.pos; 36 } 37 38 int main() 39 { 40 n = get(); m = get(); 41 for(int i = 1; i <= n + 1; i++) 42 a[i] = (power){get(), i}; 43 sort(a + 1, a + n + 1 + 1, cmp); 44 45 int pos = 1; 46 for(int i = 1; i <= n; i++) 47 { 48 pos = a[pos].pos; 49 printf("%d ", a[pos].val); 50 } 51 }
【BZOJ4104】解密運算 [暴力]