羅区-P1308統計単語の数
元の質問へのリンク:https://www.luogu.com.cn/problem/P1308
タイトル説明
一般的なテキストエディタを素早く記事に特定の単語を見つけることができますワード機能を、見つける必要があり、いくつかは、特定の単語が記事に表示された回数をカウントすることができます。
さて、あなたはこの機能をプログラミングしている、特定の要件は次のとおりです。あなたはそれが与えられた記事と最初に現れる位置に表示された回数出力、言葉を考えます。注:すなわち、一致の単語と同じ大文字と小文字を区別しないが、正確な一致を必要とするワード記事大文字と小文字を区別しないで自立語が付与されなければならない(サンプル1を参照)、与えられた単語場合記事の一部のみが(サンプル2を参照)単語の一致ではありません。
入力形式
合計2ライン。
文字のみを含む最初の文字列の動作は、指定された単語を表します。
のみ与えられた記事を表す文字やスペースを含んでいてもよい第2のストリングを行います。
出力フォーマット
ラインは、与えられた単語記事で見つかった場合には、二つの整数の間のスペースで区切られた出力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。
グループ2タイトルのnoip2011人気
C ++コード
#include <iostream>
#include <cstring>
using namespace std;
int main() {
string a,b;
int i,j,lena,lenb,idx,count=0;
getline(cin,a);
getline(cin,b);
lena=a.size();
lenb=b.size();
for(i=0;i<lena;++i)
a[i]=tolower(a[i]);
for(i=0;i<lenb;++i)
b[i]=tolower(b[i]);
for(i=0;i<lenb;++i)
{
for(j=0;j<lena;++j)
if(a[j]!=b[i+j]||(i>0&&b[i-1]!=' '))
break;
if(j==lena&&(b[i+j]==' '||i+j==lenb)) {
++count;
if(count==1)
idx=i;
}
}
if(count)
cout<<count<<' '<<idx<<endl;
else
cout<<-1<<endl;
return 0;
}
問題の解決策
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
string sent,word;
int lens,lenw,t,pos;
int main()
{
getline(cin,word);
getline(cin,sent); //字符串含有空格输入,不可以用cin,否则to me只能读到to
lenw=word.size();
lens=sent.size();
for(int i=0;i<lenw;i++)
word[i]=toupper(word[i]); //转成大写
for(int i=0;i<lens;i++)
sent[i]=toupper(sent[i]);
t=0;
for(int i=0;i<=lens-lenw;i++)
{
int j;
for(j=0;j<lenw;++j)
{
if(sent[j+i]!=word[j]) break;
if(i>0&&sent[i-1]!=' ') break; //不是单词开头就结束
}
if(j==lenw&&(sent[j+i]==' '||j+i==lens)) //单词长度匹配,后面是空格或者句末
{
t++;
if(t==1) pos=i;
}
}
if(t==0)cout<<-1;
else cout<<t<<" "<<pos;
return 0;
}