洛谷 P1308 [NOIP2011 普及组] 统计单词数 题解(字符串 C/C++)

解题的关键就是如何处理好输入信息

当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。
为了解决这个问题,可以使用一个叫做 getline 的 C++ 函数。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。


getline 函数如下所示:
getline(cin, inputLine);//inputLine为string变量
这个函数接收两个参数:一个输入流对象和一个string对象。
getline函数从输入流中读取,并保存读取的内容到 string中,但不包括换行符。

//#define LOCAL
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#define inf 0x3f3f3f3f
#define eps 1e-6
using namespace std;
#define clr(x) memset(x,0,sizeof((x)))
const int maxn = 1e4+1;//2e6+1
#define MAX(a,b,c) ((a)>(b)?((a)>(c)?(a):(c)):((b)>(c)?(b):(c)))
#define _max(a,b) ((a) > (b) ? (a) : (b))
#define _min(a,b) ((a) < (b) ? (a) : (b))
#define _for(a,b,c) for(int a = b;a

int main()
{
     
#ifdef LOCAL 
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
#endif
	string s,str;
	getline(cin,s);
	getline(cin,str);
	unsigned int i;
	for(i = 0;i<s.length();i++) {
     
		s[i] = tolower(s[i]);
	}
	for(i = 0;i<str.length();i++) {
     
		str[i] = tolower(str[i]);
	}
	//为了隔离单词
	//比如要找的单词是to,文章中有ottoman,但这是不匹配的
	//单词长度必须一样,给s加上空格后正好可以解决这个问题
	s = " "+s+" ";
	str = " "+str+" ";
	int tim = 0,tag;
	size_t loc = str.find(s,0);//size_t为unsigned int,64位系统为long long unsigned int,其大小与机器相关
	if(loc == string::npos) {
     
		cout<<-1;
	}
	else {
     
		tag = loc;
		while(loc != string::npos) {
     
			tim++;
			loc = str.find(s,loc+1);
		}
		cout<<tim<<" "<<tag;
	}
    return 0;
}

你可能感兴趣的:(洛谷,c++,字符串,c语言,算法)