华师一附中OI组

标题: P1308 统计单词数 [打印本页]

作者: vc_vitamine    时间: 2018-6-12 16:32
标题: P1308 统计单词数
https://www.luogu.org/problemnew/show/P1308
题目描述一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章
中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入输出格式输入格式:
共 2 行。
第 1 行为一个字符串,其中只含字母,表示给定单词;
第 2 行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从 0 开始);如果单词在文章中没有出现,则直接输出一个整数 −1 。
输入输出样例输入样例#1:
To
to be or not to be is a question
输出样例#1:2 0

输入样例#2:
to
Did the Ottoman Empire lose its power at that time
输出样例#2:-1

说明数据范围
1≤ 单词长度 ≤10 。
1≤ 文章长度 ≤1,000,000 。
noip2011普及组第2题





作者: 倚窗倾听风吹雨    时间: 2018-6-29 18:38
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. using namespace std;
  5. string n,s;
  6. char a[10],st[1000000];
  7. int i,t=0,j,k,l,m=1,flag=1,c=0;
  8. int b[100000];
  9. int main()
  10. {
  11.     b[0]=0;
  12.     getline(cin,n);
  13.     getline(cin,s);
  14.     for(i=0;i<n.size()-1;i++)
  15.         a[i]=n[i];
  16.     for(i=0;i<s.size()-1;i++)
  17.         st[i]=s[i];
  18.     strlwr(a);strlwr(st);
  19.     for(i=0;i<s.size()-1;i++)
  20.         if(st[i]==' ')
  21.         {
  22.             m++;///统计文章单词的总数;
  23.             b[m-1]=i+1;///存储每个单词首字母的位置
  24.         }
  25.     for(i=0;i<m;i++)
  26.     {
  27.         flag=1;
  28.         if((b[i+1]-b[i]-1)==(n.size()-1))
  29.         {
  30.             for(j=0;j<n.size()-1;j++)
  31.                 if(st[b[i]+j]!=a[j]){flag=0;break;}

  32.         }
  33.         else
  34.             flag=0;
  35.         if(flag==1)
  36.         {
  37.             t++;
  38.             if(t==1)c=b[i];
  39.         }
  40.     }
  41.     if(t>0)cout<<t<<" "<<c;
  42.     else cout<<"-1";
  43.     return 0;
  44. }
复制代码

作者: admin    时间: 2018-6-30 21:04
楼上的你好牛呀 还会getline strwrl自学的不错!
作者: 黄煦喆    时间: 2018-8-2 10:49
  1. #include<iostream>
  2. #include<string>
  3. #include<cstdio>
  4. using namespace std;
  5. int ans=-1;
  6. string word,article;
  7. int main()
  8. {
  9.     cin>>word;
  10.     getline(cin,article);
  11.     getline(cin,article);
  12.     for(int i=0;i<word.size();i++)if(word[i]>'Z')word[i]-='a'-'A';
  13.     for(int i=0;i<article.size();i++)if(article[i]>='a'&&article[i]<='z')article[i]-='a'-'A';
  14.     article=' '+article;
  15.     word=' '+word+' ';
  16.     int k=article.find(word);
  17.     int p=k;
  18.     while(k!=-1)
  19.     {
  20.         ans++;
  21.         article=article.substr(k+word.size()-1);
  22.         k=article.find(word);
  23.     }
  24.     if(ans==-1)cout<<ans;
  25.     else cout<<ans+1<<' '<<p;
  26.     return 0;
  27. }
复制代码

作者: admin    时间: 2019-3-24 10:49
  1. #include <iostream>
  2. using namespace std;
  3. string s,t;
  4. int c,p,fp;
  5. string z(string s)
  6. {
  7.     int l=s.size();
  8.     for (int i=0;i<=l-1;i++)
  9.         if (s[i]>='A' && s[i]<='Z')  s[i]=s[i]-'A'+'a';
  10.     return s;
  11. }
  12. int main()
  13. {
  14.     getline(cin,t);
  15.     getline(cin,s);

  16.     ///很重要的单词统计技巧  前后都加空格
  17.     t=" "+z(t)+" ";
  18.     s=" "+z(s)+" ";
  19.     ///cout<<t<<'\n'<<s<<'\n';
  20.     p=s.find(t);
  21.     if (p==-1) cout<<-1;
  22.     else {
  23.         fp=p;c=0;
  24.         /// 多次统计
  25.         while (p!=-1)
  26.         {
  27.             c++;
  28.             p=s.find(t,p+1);
  29.         }
  30.         cout<<c<<' '<<fp;
  31.     }

  32.     return 0;
  33. }
复制代码





欢迎光临 华师一附中OI组 (http://hsyit.cn/) Powered by Discuz! X3.2