题目链接:https://nanti.jisuanke.com/t/15768
解析:一直尺取,记录相同的个数,复杂度O(n)
代码:
#include<bits/stdc++.h> #define N 50009 using namespace std; const int INF = 0x3f3f3f3f; int a[N], b[N], c[N]; int judge(int n, int nn, int mx) { int ans = 0, x = 0; memset(c, 0, sizeof(c)); for(int i = 1; i <= nn; i++) { c[a[i]]++; if(c[a[i]] == b[a[i]]) x++; if(c[a[i]] - 1 == b[a[i]] && b[a[i]]) x--; } if(x == mx) ans++; for(int i = nn + 1; i <= n; i++) { c[a[i]]++; if(c[a[i]] == b[a[i]]) x++; if(c[a[i]] - 1 == b[a[i]] && b[a[i]]) x--; c[a[i-nn]]--; if(c[a[i-nn]] == b[a[i-nn]] && b[a[i-nn]]) x++; if(c[a[i-nn]] + 1 == b[a[i-nn]]) x--; if(x == mx) ans++; } return ans; } int main() { int n, m; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &a[i]); scanf("%d", &m); while(m--) { int num, nn, mx = 0; memset(b, 0, sizeof(b)); scanf("%d", &nn); for(int i = 1; i <= nn; i++) { scanf("%d", &num); if(!b[num]) mx++; b[num]++; } printf("%d\n", judge(n, nn, mx)); } return 0; }