2013年12月10日 星期二

Codeforce 368B Sereja ans Anagrams

[QUE?]
不太知道怎麼分類ˊˋ不過應該有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;

}

沒有留言:

張貼留言