题解 P7756

· · 题解

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

const int N=300005;
typedef long long ll;

char s[25];
int a[N],b[25][N]; //a[]是每个人的名字长度,b[i][]是名字长度为i的名字数量前缀和
int n,k;
ll ans;

int main()
{
    int i,j;
    scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
    {
        scanf("%s",s);
        a[i]=strlen(s);
    }
    for(i=2;i<=20;i++)
        for(j=1;j<=n;j++)
        {
            b[i][j]=b[i][j-1];
            if(a[j]==i)
                b[i][j]++;
        } //求前缀和
    for(i=1;i<=n;i++) //第i名最远只能和第i+k名做好朋友
    {
        if(i+k<n)
            ans+=(ll)b[a[i]][i+k]-b[a[i]][i];
        else //注意排名靠后的几个人最远只能和最后一名做好朋友
            ans+=(ll)b[a[i]][n]-b[a[i]][i];
    }
    printf("%lld\n",ans);
    return 0;
}