题解 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;
}
我可不可以求一波赞٩(๑❛ᴗ❛๑)۶