滑动窗口的O(n)写法
适用于求距离为k的范围内与之相同的数有多少个
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
string s[N];
map<string,int> mp;
int main()
{
int n, k;
cin >> n >> k;
for(int i = 0; i < n;i++)
{
cin >> s[i];
}
long long ans = 0;
for (int i = 0; i < n; i++)
{
if(i - k - 2 >= 0)//保证数组不越界
{
mp[s[i - k - 2]]--;//如果出了窗口就--
}
ans += mp[s[i]];//看看距离k的范围内有多少个配对的
mp[s[i]]++;//进窗口++
}
cout << ans << endl;
}