题解 P2264 【情书】

· · 题解

这道题涉及了许多繁琐的步骤:

1.关键词判重

2.判断句子是否结束

3.大小写的统一

4.情书写得好不好

关于第①点用一个use数组判断,若use[i]!=0那么word[i]就是出现过

第②点就是使用找那个句点,很easy的

第③点,这里推荐一个STL transform,还是比较好用的(tolower是变小写,toupper是变大写)

PS:本来找句点我还用了个好东西:

.find_first_of(".");
.find_last_of(".");
就是找第一个(最后一个)句点,如果有就返回位置,没有就返回-1
#include<bits/stdc++.h>
using namespace std;
int n,tot,use[2010];
string word[2010],sen,sent="";

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)//++i比i++快
    {
        cin>>word[i];
        transform(word[i].begin(),word[i].end(),word[i].begin(),::tolower);
        //关键词变小写
    }
    getchar();//不能少啊,坑我好久
    getline(cin,sen);
    transform(sen.begin(),sen.end(),sen.begin(),::tolower);//整句变小写
    for(int i=0;i<sen.size();++i)
    {
        if(sen[i]=='.')//如果是  .
        {
            for(int j=1;j<=n;++j)
            {
                if(sent==word[j]&&!use[j])
                {
                    use[j]=1,++tot;
                    break;//其实这里还可以优化,但我懒
                }
            }
            sent="";
            memset(use,0,sizeof(use));//进入下一句,所有关键词又都可以增加好感
            continue;
        }
        if(sen[i]==',')
        {
            for(int j=1;j<=n;++j)
            {
                if(sent==word[j]&&!use[j])//与句号类似,没有清空use数组
                {
                    use[j]=1,++tot;
                    break;
                }
            }
            sent="";
            continue;
        }
        if(sen[i]==' ')
        {
            for(int j=1;j<=n;++j)
            {
                if(sent==word[j]&&!use[j])//如果是空格说明一个单词结束了
                {
                    use[j]=1,++tot;
                    break;
                }
            }
            sent="";
            continue;
        }
        sent+=sen[i];//不是句点不是逗号不是空格,那肯定是字母了
    }
    printf("%d",tot);//水完了
    return 0;
}

我可不可以求一波赞٩(๑❛ᴗ❛๑)۶