10115 - Automatic Editing

题意:
字符串批量替换, 即读入 findStirng 和 replaceString 和需要操作的 text, 然后使用 replaceString 来替换 text 中的 findString, 直至 text 中再也找不到 findString 为止.

思路:
把读入的每对 findString 和 replaceString 应用到字符串 text 上;

要点:
1. 对于 string 的替换, 不能用 <algorithm> 里的 replace, 因为这个是不能改变空间的, 对于 string, 应该用 string 的 replace.

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

代码:

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


// 对 text 应用规则, 其中 findString 与  replaceString 中的数据是一一对应的
string applyRules(string text, const vector<string>& findString, const vector<string>& replaceString)
{
	for(int i=0; i<findString.size(); i++){
		size_t pos;
		while((pos = text.find(findString[i])) != string::npos){
			text = text.replace(pos, findString[i].size(), replaceString[i]);
		}
	}

	return text;
}


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

	vector<string> findString;
	vector<string> replaceString;

	string line;
	while(ruleNum != 0){
		cin.ignore();			// 确保后面的 getline 不会读入空行
		
		findString.clear();
		replaceString.clear();

		// 每个 rule 都包含一个 findString 和一个 replaceString
		for(int i=0; i<ruleNum; i++){
			getline(cin, line);
			findString.push_back(line);

			getline(cin, line);
			replaceString.push_back(line);
		}

		// 读入需要进行 rule 的 text
		getline(cin, line);

		// 应用 rule 并输出
		cout << applyRules(line, findString, replaceString) << endl;

		cin >> ruleNum;
	}

	return 0;
}

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

你可能感兴趣的:(automatic,editing,10115)