STL操作。。。。当值减小到0的时候一定要记得将这个元素删除。。。。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <queue> using namespace std; const int maxn=220000; typedef map<int,int> mII; mII B; int n,m,p,a[maxn],ans[maxn],cnt=0; bool vis[maxn]; int main() { scanf("%d%d%d",&n,&m,&p); B.clear(); for(int i=1;i<=n;i++) scanf("%d",a+i); for(int i=0;i<m;i++) { int x; scanf("%d",&x); B[x]++; } if((m-1)*p+1>n) {printf("0\n");return 0;} for(int i=1;i<=p;i++)///P种不同的开始点 { deque<int> q;mII tp; tp.clear(); memset(vis,false,sizeof(vis)); for(int j=i;j<=n;j+=p) { q.push_back(j); tp[a[j]]++; if(q.size()>m) { int u=q.front(); q.pop_front(); tp[a[u]]--; if(tp[a[u]]==0) tp.erase(a[u]); } if(tp==B) { ans[cnt++]=q.front(); } } } sort(ans,ans+cnt); printf("%d\n",cnt); for(int i=0;i<cnt;i++) { if(i) putchar(32); printf("%d",ans[i]); } putchar(10); return 0; }