洛谷: P1308 [NOIP2011 普及组] 统计单词数

前言:

这道题没理解清题目表达意思,我开始想的是用map来记录个数,然后一个变量记录一开始出现的单词位置,不挺简单的吗,然后....就AC了2个..从错误提示能看到个数没啥问题,但是第一个单词位置不对,看了新样例发现,输入文本前面可能是空格....

样例:

输入

td
  Td tLWCsrmt

输出
1 2

没AC过的代码:

#include 
using namespace std;
string s, tmp;
map mp;
int main() {
	cin >> s;
	transform(s.begin(), s.end(), s.begin(),::tolower);
	int cnt = 0;
	int flag = -1;
	while (cin >> tmp) {
		transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower);
		if (flag == -1 && tmp == s) {
			flag = cnt;
		}
		cnt += tmp.size();
		mp[tmp]++;
		cin.get();
		cnt += 1;
	}
	if (flag == -1) {
		cout << "-1";
	}
	else {
		cout << mp[s] << " " << flag;
	}
	return 0;
}

修整之后:

输入s两端需要加上空格,因为题目要求是一个独立的单词完全适配,不加空格会部分适配。

b加空格的原因是s加了空格(样例1那样目标出现在首部或者尾部)

#include 
using namespace std;
string s, b;
int cnt, pos = -1;
int main() {
	cin >> s;
	transform(s.begin(), s.end(), s.begin(),::tolower);
	s = ' ' + s + ' ';
	cin.get();
	getline(cin, b);
	//将b转化为小写
	transform(b.begin(), b.end(), b.begin(), ::tolower);
	b = ' ' + b + ' ';
	//在b中查找a
	int p = 0;
	while ((p = b.find(s, p)) != string::npos) {
		cnt++;//次数
		if (cnt == 1) pos = p;
		p++;
	}
	if (cnt > 0) printf("%d %d\n", cnt, pos);
	else printf("%d", -1);
	return 0;
}

洛谷: P1308 [NOIP2011 普及组] 统计单词数_第1张图片

你可能感兴趣的:(OJ,算法)