1. 程式人生 > >【BZOJ4104】解密運算 [暴力]

【BZOJ4104】解密運算 [暴力]

== i++ ring out solution bsp desc 字符串 splay

解密運算

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

  第一行有兩個整數N,M,分別表示加密前的字符串長度和字符集大小,其中字符用整數1,2,3,...,M編號,添加的特殊字符“."用0編號。   第二行為N+1個整數,表示加密後的字符串。

Output

  輸出僅一行,包含N個整數,用空格隔開,依次表示加密前字符串中每個字符的編號。

Sample Input

  6 3
  1 1 1 3 0 1 2

Sample Output

  1 2 3 1 1 1

HINT

  N,M<=200000

Solution

  顯然,按照權值(即這個字符串首字母)為第一關鍵字

位置(即這個字符後面的串的排名)為第二關鍵字排序。
  然後這時候權值就是矩陣的第一列
  形如:
    *ABCD
    -----
    -----

  這時第一行後面ABCD的排名,顯然就是讀入中*的位置,因為*作為ABCD*的最後一個字符。
  比如ABCD*排名為x,那麽這時候 A 顯然在矩陣第一列中的第x個,輸出即可。

Code

技術分享
 1 #include<iostream>    
 2 #include<string>    
 3 #include<algorithm>    
 4 #include<cstdio>    
 5
#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 }
View Code

【BZOJ4104】解密運算 [暴力]