洛谷P1308 统计单词数(简单理解)

!!!审题!!! 图片上面写好了!!!
在这里插入图片描述
原题:题目链接点这里
思路:

1.读入字符串
(需用getline整行读入,因为cin读入到空格时会停止。)

2.转化大小写(题目不区分大小写)

3.查找空格并提取字符串(题目的要求就是完整的单词!!!)
我一开始就是错在这里,以为只要出现word就行,后来重新审题就是单独的单词!!!

4.相互比较也就是模拟!!!

#include<bits/stdc++.h>
#define pb push_back
#define pback pop_back
#define ll long long 
using namespace std;
const ll modd=1e9+7;
const int maxn=75005;

string word,s;
vector<int>v;
int main(){
	getline(cin,word);             		//这个就是整行读入
	getline(cin,s);
	s=' '+s+' ';                      			//这个文章你可以加这个空格
	int la=word.size();
	int lb=s.size();
	for(int i=0;i<la;i++)					//全部转换成小写
		if(word[i]>='A'&&word[i]<='Z')
			word[i]+=32;
	for(int i=0;i<lb;i++)
		if(s[i]>='A'&&s[i]<='Z')
			s[i]+=32;
	int cnt1=0,cnt2=0;               //cnt1出现的次数    cnt2表示位置
	for(int i=0,j=0;i<lb;){				// 这个就是文章 也就是母串
		int k=i;								//这个需要记下k    表示枚举的第k个位置
		if(word[j]==s[i]){				
			while(word[j]==s[i]&&i<lb&&j<la){
				j++; i++;
			}			
			if(j==la){
				if(s[k-1]==' '&&s[k+j]==' '){		//这个就是判断是不是满足一个单词要求,就是独立
					if(cnt1==0)
					cnt2=k-1;
					cnt1++;
				}
				i=k+j;										//这里类似  kmp    不需要重复比较 
			}else{
				i=k+j-1; 
			}
		}else{
			i++;
			j=0;
		}
	}
	//最后就是比较的结果对比
	if(cnt1==0){
		puts("-1");
	}else
	printf("%d %d\n",cnt1,cnt2); 
	return 0;
}

个人觉得还是不要用stl库函数去做!!!毕竟模拟对你有好处!!!
很多字符串的函数:点这里

猜你喜欢

转载自blog.csdn.net/qq_43127921/article/details/86612484