1. 程式人生 > >NOIP模擬模擬(古代密碼)

NOIP模擬模擬(古代密碼)

題目

古羅馬帝國有一個擁有各種部門的強大政府組織。其中一個部門就是保密服務部門。為了保險起見,在省與省之間傳遞的重要檔案中的大寫字母是加密的。當時最流行的加密方法是替換和重新排列。 替換方法是將所有出現的字元按照一個規則替換,比如ABCDEFGHIJKLMNOPQRSTUVWXYZ到BCDEFGHIJKLMNOPQRSTUVWXYZA,如果原詞是 “VICTORIOUS” 則它變成 “WJDUPSJPVT”。 排列方法改變原來單詞中字母的順序。例如:將順序<2, 1, 5, 4, 3, 7, 6, 10, 9, 8>應用到 “VICTORIOUS” 上,則得到"IVOTCIRSUO"。 人們很快意識到單獨應用替換方法或排列方法加密,都是很不保險的。但是如果結合這兩種方法,在當時就可以得到非常可靠的加密方法。所以,很多重要資訊先使用替換方法加密,再將加密的結果用排列的方法加密。用兩種方法結合就可以將"VICTORIOUS" 加密成"JWPUDJSTVP"。 考古學家最近在一個石臺上發現了一些資訊。初看起來它們毫無意義,所以有人設想它們可能是用替換和排列的方法被加密了。人們試著解讀了石臺上的密碼,現在他們想檢查解讀的是否正確。他們需要一個計算機程式來驗證,你的任務就是寫這個驗證程式。 輸入 輸入有兩行。第一行是石臺上的文字。文字中沒有空格,並且只有大寫英文字母。第二行是被解讀出來的加密前的文字。第二行也是由大寫英文字母構成的。 兩行字元數目的長度都不超過100。 輸出 如果第二行經過某種加密方法後可以產生第一行的資訊,輸出 “YES”,否則輸出"NO"。 樣例輸入 JWPUDJSTVP VICTORIOUS 樣例輸出 YES 提示 對於30%的資料:字串長度<=10 對於50%的資料:字串長度<=50 對於100%的資料:字串長度<=100

很簡單的一個字串處理啊

只是需要注意

替換不一定是有規律的,很有可能是錯開的

所以只能統計每種字元出現的個數,然後比較是否是對應的就是了

#include<bits/stdc++.h>
using namespace std;
char a[105],b[105];
int lena,lenb,numa[35],numb[35];
int main(){

	cin>>a;
	cin>>b;
	lena=strlen(a);
	lenb=strlen(b);
	if(lena!=lenb) 
	{
		cout<<"NO"<<endl;
		return 0;
	}
	for(int i=0;i<lena;i++)
	{
		numa[a[i]-'A']++;
		numb[b[i]-'A']++;
	}
	sort(numa,numa+26);
	sort(numb,numb+26);
	for(int i=0;i<26;i++)
	{
		if(numa[i]!=numb[i])
		{
			cout<<"NO"<<'\n';
			return 0;
		}
	}
	cout<<"YES"<<'\n';
	return 0;
}