# String Manipulation# Greedy# Simulation

i400 - 2. 字串解碼

🔗 前往 ZeroJudge 原題

題目描述

題目要求解碼一個經過多層加密的字串。加密過程涉及使用多個 01 字串,每個字串對原始字串進行一次轉換。轉換包括根據 01 字串中 '1' 的數量奇偶性來翻轉字串,以及根據 01 字串的位元來決定字串的字元添加順序。目標是根據給定的加密表和加密後的字串,還原出原始字串。

解題思路

解題的核心是模擬加密的逆過程。由於加密是按照順序進行的,因此解碼也需要按照加密的相反順序進行。對於每個 01 字串,首先判斷 '1' 的數量是奇數還是偶數,如果是奇數,則需要將字串翻轉。然後,根據 01 字串的位元,將字串的字元依次添加到解碼後的字串的開頭或結尾。

複雜度分析

  • 時間複雜度: O(m * n^2),其中 m 是 01 字串的數量,n 是字串的長度。因為對於每個 01 字串,都需要遍歷字串的每個位元,並且可能需要翻轉字串。
  • 空間複雜度: O(n),因為需要儲存解碼後的字串。

程式碼

#include <iostream>
using namespace std;
int m,n;
string a[105],s;
int main(){
	cin.tie(0); ios::sync_with_stdio(false);
	cin >> m >> n;
	for(int i=0;i<m;++i)
		cin >> a[i];
	cin >> s;
	for(int i=m-1;i>=0;--i){
		int o=0;
		string t;
		for(int j=n-1;j>=0;--j){
			if(a[i][j]=='1'){//54321 -> 15432
				++o;
				t+=s[j];
			}
			else{//54321 -> 43215
				t=s[j]+t;
			}
		}
		s=t;
		if(o%2)
			for(int j=0;j<n/2;++j)
				swap(s[j],s[n/2+j+n%2]);
	}
	cout << s;
}

Discussion