• programming-challenges Crypt Kicker (110204) 题解


    我的解答,可是复杂度不是非常惬意,是一个指数级的复杂度.可是測试数据比較弱,还是ac了。在网上找了找。都是brute force的解法,不知道有没有更好的解法。

    解答中犯了两个错误,第一个。map<int, vector<int>> 的定义不被接受。可是这肯定是一个合法的c++定义。第二个,忘了考虑映射字符间反向的约束。也就是"ab"可能会被翻译成"cc"。这是错误的。字符间从源到目标,从目标到源。都应该不存在一对多的映射。

    #include <iostream>
    #include <sstream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <queue>
    #include <map>
    #include <set>
    #include <stack>
    #include <assert.h>
    #include <algorithm>
    #include <math.h>
    #include <ctime>
    #include <functional>
    #include <string.h>
    #include <stdio.h>
    #include <numeric>
    #include <float.h>
    
    using namespace std;
    
    vector<string> words;
    vector<string> m_dic[81];
    vector<int> finalMatchRelation; 
    
    bool findMatchString(int index, vector<int> matchedCharacter, vector<int> getMatched) {
    	if (index >= words.size()) {
    		finalMatchRelation = matchedCharacter;
    		return true;
    	}
    
    	vector<int> matchedCharacterBackup = matchedCharacter;
    	vector<int> getMatchedBackup = getMatched; 
    
    	int l = words[index].size();
    	for (int i = 0; i < m_dic[l].size(); i++) {
    		bool ok = true;
    		for (int j = 0; j < words[index].size() && ok; j++) {
    			int srcCharIndex = words[index][j] - 'a';
    			int objCharIndex = m_dic[l][i][j] - 'a'; 
    
    			if (matchedCharacter[srcCharIndex] == -1 && getMatched[objCharIndex] == -1) {
    				matchedCharacter[srcCharIndex] = objCharIndex;
    				getMatched[objCharIndex] = srcCharIndex; 
    			}
    			else if (matchedCharacter[srcCharIndex] == (m_dic[l][i][j] - 'a')) {
    				continue;
    			}
    			else {
    				ok = false;
    			}
    		}
    
    		if (ok) {
    			bool goodResult = findMatchString(index + 1, matchedCharacter, getMatched); 
    			if (goodResult) {
    				return true;
    			}
    		}
    
    		matchedCharacter = matchedCharacterBackup;
    		getMatched = getMatchedBackup; 
    	}
    	return false;
    }
    
    int main() {
    	string placeHolder;
    	int n;
    	cin >> n; 
    	getline(cin, placeHolder); 
    	
    	for (int i = 0; i < n; i++) { 
    		string ts; 
    		getline(cin, ts); 
    		m_dic[ts.size()].push_back(ts); 
    	}
    
    	string s; 
    	while (getline(cin, s)) {
    		vector<int> matchRelation(26, -1), getMatched(26, -1); 
    
    		stringstream ss(s);
    		string ts; 
    		words.clear();
    		while (ss >> ts) {
    			words.push_back(ts); 
    		}
    
    		string result = "";
    		if (findMatchString(0, matchRelation, getMatched)) {
    			for (int i = 0; i < s.size(); i++) {
    				if (s[i] == ' ')
    					result.push_back(' ');
    				else
    					result.push_back('a' + finalMatchRelation[s[i] - 'a']); 
    			}
    		}
    		else {
    			for (int i = 0; i < s.size(); i++) {
    				if (s[i] == ' ')
    					result.push_back(' ');
    				else
    					result.push_back('*');
    			}
    		}
    		cout << result << endl; 
    	}
    
    	return 0; 
    }



  • 相关阅读:
    【C++】几个简单课本例题
    【汇编】AX内容依次倒排序
    【汇编】课本第三章例题
    【汇编】补码的理解+标志寄存器的相关探索
    【记录】台式机的组装
    【记录】.bin文件 到 .vdi文件的转换教程
    【汇编】1.汇编环境的搭建:DOSBox的安装
    docker的常用命令,以及postgressql的启动
    Docker中容器的备份、恢复和迁移
    C# 常见面试问题汇总
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/7017142.html
Copyright © 2020-2023  润新知