644 - Immediate Decodability

题意:
1. 判断输入的字符串组是否是"可以直接解码"的, 即判断其中每一个字符串是不是其余字符串的前缀; 若全不是其余字符串的前缀,则称为"可以直接解码(immediately decodable)", 否则就是"不可以直接解码(not immediately decodable)'; 
2. 每一组输入之间以 9 进行分隔.

思路:
1. 对输入的每一个字符串, 判断其是否是 group 中一个字符串的前缀
(1). 若是, 则整组都是 not immediately decodable, 后面的字符串也无需再进行判断.
(2). 若不是, 则把当前字符串添加到 group 中
(3). 读入下一个字符串, 返回 1

2. 通过自定义的 compare 函数来比较两个字符串的相等, 即只要其中一个是另一个的前缀, 它们就是相等的, 从而可以直接调用 STL 中的 search 函数进行查找.

要点:
1. 使用 min 求两数中的较小值; max 求两数中的较大值.
2. find 不能使用自定义函数为参数进行查找; search 才可以, 但是 search 要求必须是两个区间段之间的查找.

题目:
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=96&page=show_problem&problem=585

代码:

# include <iostream>
# include <string>
# include <cstdio>
# include <cstring>
# include <vector>
# include <algorithm>
# include <cctype>
using namespace std;


// 比较两个字符串相等, 当一个字符串是另一个字符串的前缀时也相等 
bool immediateCompare(const string& str1, const string& str2){
	int len = min(str1.size(), str2.size());

	for(int i=0; i<len; i++){
		if(str1[i] != str2[i])
			return false;
	}
	
	return true;
}


int main(int argc, char const *argv[])
{
	#ifndef ONLINE_JUDGE
		freopen ("644_i.txt", "r", stdin);  
		freopen ("644_o.txt", "w", stdout); 
	#endif
	
	int groupNum = 0;

	string line;
	bool immediately = true;
	vector<string> group;

	while(!cin.eof()){
		getline(cin, line);

		// 新的一个 group 开始, 输出并重置 immediately 和 group
		if(line == "9"){
			if(immediately){
				cout << "Set " << ++groupNum << " is immediately decodable" << endl;
			}else{
				cout << "Set " << ++groupNum << " is not immediately decodable" << endl;
			}

			immediately = true;
			group.clear();
			continue;
		}

		// 如果前面已经判断出是 not immediately 了, 那么后面的操作无需再进行
		if(!immediately)
			continue;

		// 这样写是为了能使用下面的 search 函数
		vector<string> temp;
		temp.push_back(line);

		// 判断 group 中是否有和当前 line 为前缀的字符串, 若有, 则 immediately 为 true 
		if(search(group.begin(), group.end(), temp.begin(), temp.end(), immediateCompare) != group.end())
			immediately = false;

		group.push_back(line);

	}


	return 0;
}

环境: C++ 4.5.3 - GNU C++ Compiler with options: -lm -lcrypt -O2 -pipe -DONLINE_JUDGE

UPDATE: 644 - Immediate Decodability (Update) 

你可能感兴趣的:(immediate,644,Decodability)