问题标题: 洛谷:P1308 统计单词数 求大佬,我只得了30分

0
0
已解决
栾峻岩
栾峻岩
初级天翼
初级天翼

以下是我的代码:

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string a,b;
    getline(cin,a);
    getline(cin,b);
    int l=a.size(),k=b.size();
    int num=0,sum=0,x=0,y;
    for (int i=0;i<l;i++)
    {
        if (a[i]<='z' && a[i]>='a')
            a[i]=char(a[i]-32);
    }
    for (int i=0;i<k;i++)
    {
        if (b[i]<='z' && b[i]>='a')
            b[i]=char(b[i]-32);
    }
    int m=b.find(a,0);
    y=m;
    while (y!=-1)
    {
        sum++;
        x=y+(a.size());
        y=b.find(a,x);
    }
    if (m!=-1)
    {
        for (int i=0;i<m;i++)
        {
            if (b[i]==' ') num++;
        }
        if (b[m-1]==' ' || m==0)
            cout<<sum<<" "<<num;
        else
            cout<<"-1";
    }
    else 
        cout<<"-1";
} 

求助,为什么就三十分。

网址:P1308

题目:

题目描述

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。

现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章

中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。

输入输出格式

输入格式:

 

共222行。

第111行为一个字符串,其中只含字母,表示给定单词;

第222行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

 

输出格式:

 

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从000 开始);如果单词在文章中没有出现,则直接输出一个整数−1-1−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≤1≤ 1≤单词长度≤10≤10≤10。

1≤1≤ 1≤文章长度≤1,000,000≤1,000,000≤1,000,000。

noip2011普及组第2题

栾峻岩在2018-11-06 13:13:12追加了内容

@杨喆 @酷町喵~o( =∩ω∩= )o~ @贾敬波 @葛新 @陆麟瑞 @贾文卓 @樊澄宇  @贾子昂 @刘斐 @Every Body


0
已采纳
赵逸凡
赵逸凡
初级启示者
初级启示者

你(您)是哪几个测试点错的???

noip题目好坑,真的,最好不要手写这一段

noip专门用尽c++函数和指针

这里要用到<ctype.h>库的函数,转换为小写字母--tolower函数,或者是字符数组小写字母处理函数str某某某,此时的字符串与字符数组还需要指针c风格的转换,又需要字符串的很多函数

----我不是望采纳之线----

赵逸凡在2018-11-01 18:58:31追加了内容

好玩的是第二张照片,从上往下看是绿色或青蓝色,从下往上看是深蓝色

0
周建勋
周建勋
中级光能
中级光能

 

string a;

 

string b;

 

//用string库,调用getline, 直接读入一整行

 

getline(cin,a);

 

getline(cin,b);

 

//转换大小写,可以都转换为大写,或者小写

 

for (int i=0;i<a.length();++i){

 

a[i]=tolower(a[i]);

 

}

 

for (int i=0;i<b.length();++i){

 

b[i]=tolower(b[i]);

 

}

 

//因为连起来的不算,所以要在前后加几个空格,一定要是同样多的,同量减同量,等于同量

 

a=' '+a+' ';

 

b=' '+b+' ';

 

//先看看会不会找不到,用a.find()和string::npos

 

if (b.find(a)==string::npos){

 

cout<<-1<<endl;

 

}

 

//如果找得到

 

else {

 

int alpha=b.find(a);

 

int beta=b.find(a),s=0;//计数器初始化为0

 

while (beta!=string::npos){

 

++s;//计数器

 

beta=b.find(a,beta+1);

 

}

 

cout<<s<<" "<<alpha<<endl;//输出第一个和总共有几个

 

}

0
0
0
0
0
尹宗鑫
尹宗鑫
新手守护
新手守护

洛谷里的题解:

string a;
    string b;
    //用string库,调用getline, 直接读入一整行
    getline(cin,a);
    getline(cin,b);
    //转换大小写,可以都转换为大写,或者小写
    for (int i=0;i<a.length();++i){
        a[i]=tolower(a[i]);
    }
    for (int i=0;i<b.length();++i){
        b[i]=tolower(b[i]);
    }
    //因为连起来的不算,所以要在前后加几个空格,一定要是同样多的,同量减同量,等于同量
    a=' '+a+' ';
    b=' '+b+' ';
    //先看看会不会找不到,用a.find()和string::npos
    if (b.find(a)==string::npos){
        cout<<-1<<endl;
    }
    //如果找得到
    else {
        int alpha=b.find(a);
        int beta=b.find(a),s=0;//计数器初始化为0
        while (beta!=string::npos){
            ++s;//计数器
            beta=b.find(a,beta+1);
        }
        cout<<s<<" "<<alpha<<endl;//输出第一个和总共有几个
    }

 

我要回答