不太知道怎麼分類ˊˋ不過應該有QUE的概念@@
第一次用MAP暴力ˊˋ
http://codeforces.com/problemset/problem/367/B
#include<stdio.h> #include<stdlib.h> #include<algorithm> #include<cstring> #include<map #include<vector> #define min(x,y) (((x)>(y)) ? (y):(x)) #define max(x,y) (((x)>(y)) ? (x):(y)) using namespace std; #define NN 200010 #define LL long long int int Line[NN]; map<int,int> mask; vector<int> ans;map<int,int> prc; int main() { ans.clear(); LL _n,_m,_p;scanf("%I64d %I64d %I64d",&_n,&_m,&_p); if((_m-1)*_p>_n) { printf("0\n"); return 0; } int n=(int)_n,m=(int)_m,p=(int)_p; int matchsize=0; for(int lx=1;lx<=n;lx++) scanf("%d",&Line[lx]); for(LL lx=1;lx<=m;lx++) { int I;scanf("%d",&I); mask[I]++; } matchsize=mask.size(); for(int lx=1;lx<=p;lx++) { int match=0; for(int ly=0;ly<m;ly++) { int I=Line[lx+ly*p]; if(mask[I]!=0) { if(mask[I]==(prc[I]+1)) match++; else if(mask[I]==prc[I]) match--; prc[I]++; } } if(match==matchsize) ans.push_back(lx); for(int ly=m;(lx+ly*p)<=n;ly++) { int I=Line[lx+ly*p]; int J=Line[lx+(ly-m)*p]; if(mask[I]!=0) { if(mask[I]==(prc[I]+1)) match++; else if(mask[I]==prc[I]) match--; prc[I]++; } if(mask[J]!=0) { if((mask[J])==(prc[J]-1)) match++; else if(mask[J]==prc[J]) match--; prc[J]--; } if(match==matchsize) ans.push_back(lx+(ly-m+1)*p); } prc.clear(); } printf("%d\n",ans.size()); sort(ans.begin(),ans.end()); for(int lx=0;lx<ans.size();lx++) printf("%d ",ans[lx]); return 0; }
沒有留言:
張貼留言