题目链接:
http://codeforces.com/contest/367/problem/B
题解:
双端队列直接维护(原来map可以直接相等,这里学到了。。。)
代码:
#include <map>
#include <cmath>
#include <deque>
#include <vector>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define met(a,b) memset(a,b,sizeof(a))
const int maxn = 2e5+10;
int a[maxn],b[maxn];
map<int,int>mp,np;
vector<int>pos;
int n,m,p;
int main()
{
scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
scanf("%d", &a[i]);
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);
mp[b[i]]++;
}
for(int i=1;i<=p;i++)
{
deque<int>q;
np.clear();
for(int j=i;j<=n;j+=p)
{
q.push_back(j);
np[a[j]]++;
if(q.size()>m)
{
int k=q.front();
q.pop_front();
np[a[k]]--;
if(np[a[k]]==0)
np.erase(a[k]);
}
if(np==mp)
pos.push_back(q.front());
}
}
sort(pos.begin(),pos.end());
int len=(int)pos.size();
printf("%d\n",len);
for(int i=0;i<len;i++)
{
printf("%d",pos[i]);
if(i!=len-1)
printf(" ");
else
printf("\n");
}
}
CodeForces B题解
本文提供了一种使用双端队列和map解决CodeForces 367/B问题的方法,通过遍历输入序列并利用数据结构高效地比较子序列与目标序列,找到所有匹配的起始位置。
598

被折叠的 条评论
为什么被折叠?



