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;
}
时间: 2024-11-18 07:58:55

programming-challenges Crypt Kicker (110204) 题解的相关文章

2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016) 个人题解

Problem C Careful Ascent 可怜的我们被卡在了签到题上,当时用的二分来做,结果速度的左右区间写成了[0,1e32],而改成[-1e32,1e32]就通过了,哎-,怎么就没想到去改一下区间的范围呢. 下面是正常的数学解法,类似于解一元一次方程. #include <iostream> using namespace std; typedef long long ll; ll x,y,n; ll a,b;double c; int main(){ cin>>x&g

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

HOJ 题目分类

转自:http://blog.sina.com.cn/s/blog_65f3869301011a1o.html ******************************************************************************* 简单题(包括枚举,二分查找,(复杂)模拟,基础数据结构(栈.队列),杂题等 ****************************************************************************

Online Judge for ACM-ICPC etc.

原文链接:http://blog.csdn.net/tigerisland45/article/details/52134189 Virtual Judge ACM-ICPC Live Archive - Home UVa Online Judge - Home Welcome To PKU JudgeOnline(POJ) Welcome to Hangzhou Dianzi University Online Judge(HDU) OpenJudge - 百练 - 首页(PKU) Codef

[it-ebooks]电子书列表

#### it-ebooks电子书质量不错,但搜索功能不是很好 #### 格式说明  [ ]中为年份      ||  前后是标题和副标题  #### [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Objective-C to develop iPhone games http://it-ebooks.info/book/3544/ Learning Web App Developmen

【POJ】2528 Mayor&#39;s posters ——离散化+线段树

Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city