# 月赛46 C 英语作文: 题目:

alt alt

题解:

对于每一个单词都只判断前面在一定范围内是否有满足条件的即可,首先将string与数字联系起来的map能想到,但接下来的处理:对左右单词再从左到右读一遍,读到的每一个让mp[string]++,(但是,这一步是,放到一个循环体的最后,因为对于妹妹一个单词,问的是出现的对数,而不是连通当前这个单词出现的次数,所以这里的map[string]++说白了其实是为了后面的单词的处理进行的操作。)表示这个单词的map加了一,然后当读到第i个单词,要看第i-k-2个单词就是范围之外了。就比如题目中例子里,在读到第5个单词的时候,第2个单词就不能算在范围里面,因为5-2=3>k..所以要有第(i-k-2)对应的string 对应的map--. 代码如下:

#include <cstring>
#include <map>
using namespace std;
string s[100005];
int main()
{
    map<string,int>mp;
    long long ans=0;
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
       cin>>s[i];
    }//以上就是准备工作的完毕。
    for(int i=1;i<=n;i++){
        if(i-k-2>=1) mp[s[i-k-2]]--;//对于不在范围的进行减一操作。
        ans+=mp[s[i]];
        mp[s[i]]++;//这一句,对读入的每一个都让map++。
        //是为了后面的单词的运算
        //所以这一步是放在这个循环体的操作里的最后一步。
    }
    cout<<ans;
    return 0;
}

总结: 知识点其实基本没有高深的,但是就是为了处理一个实际问题而采用的方法。考试时实在想不到,这说明什么?小朋友,还得练。