Stat
Description
请你编程实现一个简单(渣渣)的文本编辑器,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同,如果给定单词仅是文章中某一单词的一部分则不算匹配。
Input
输入文件名为stat.in ,2 行。
第1 行一个字符串,只含字母,表示给定单词
第2 行一个字符串,只可能包含字母和空格,表示给定的文章。
Output
输出文件名为stat.out 。
一行,如果在文章中找到给定单词则输出两个整数,整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,输出-1。
SampleInput&Output
#1:
To
to be or not to be is a question
#2:
to
Did the Ottoman Empire lose its power at that time
#1:
2 0
#2:
-1
Hint
1≤ 单词长度≤10。
1≤ 文章长度≤1000000
这道题就是简单的字符匹配。
首先读入一个目标字符串,然后再循环读入每个单词,如果相同,匹配=true,遍历要搜索的字符串。最后输出结果。
这里需要注意的一点是,测评给出的数据中,要搜索的字符串的开头不一定是个字符,有可能是空格,比如说这个:
它的"td"和"Td"之间有好几个空格,如果用cin输入字符串的话,cin会直接省略掉这几个空格,答案就不正确了。这时候就需要另一个输入string的函数——getline()。getline()的原型是
istream& getline ( istream &is , string &str , char delim );
这里第一个参数是输入流,第二个参数是要输入的字符串名,第三个是读到这个字符停止(默认是’\n’)。
这个函数就可以读入带空格的字符串了
另外,题目中要求不管大小写,所以我们在输入的时候可以把所有输入转为小写,再判断。这里用到一个函数:
tolower();
它可以把字符转换为小写,用法见下面程序。
下面贴源码:
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<sstream> 5 #include<windows.h> 6 using namespace std; 7 8 string mubiao; 9 10 int wei=0,cishu=0,firstwei=0; 11 12 bool guo=false,you=false; 13 14 int main() 15 { 16 freopen("stat.in","r",stdin); 17 freopen("stat.out","w",stdout); 18 cin>>mubiao; 19 for(int i=0;i<mubiao.length();i++) 20 { 21 mubiao[i] = tolower(mubiao[i]);//转换目标为小写 22 } 23 string shuju; 24 string kong=" "; 25 while(getline(cin,shuju,' ')) 26 { 27 if(shuju==kong) 28 { 29 firstwei++; 30 } 31 else 32 { 33 for(int i=0;i<shuju.length();i++) 34 { 35 shuju[i] = tolower(shuju[i]);//转换输入为小写 36 } 37 if(shuju==mubiao) 38 { 39 you=true; 40 cishu++; 41 } 42 if(!you) 43 { 44 firstwei+=shuju.length()+1; 45 } 46 } 47 48 49 } 50 if(you) 51 { 52 cout<<cishu<<' '<<firstwei-1; 53 } 54 else 55 { 56 cout<<"-1"; 57 } 58 59 fclose(stdout);fclose(stdin);//可加可不加 60 return 0; 61 }