Codeforces Round #215 (Div. 2) D Sereja ans Anagrams

2014-11-24 02:44:38 · 作者: · 浏览: 6
分析:当时比赛的时候看这道题、直接暴力+剪枝没有过、然后又想了想、用队列来维护区间的元素个数、觉得可行、可惜笔记本没坚持到我写完。。于是今天早上起来又写了一遍、由于没考虑到int*int会超出int的范围而wrong answer了几次、后来发现改正之后AC了、时间复杂度我不怎么会算、有学长说这样是O(N)、可怜
#include  
#include  
#include  
#include  
#include  
using namespace std;  
const int maxn=2*100005;  
int a[maxn];  
int b[maxn];  
int pos[maxn];  
int num[maxn];  
int num1[maxn];  
int main(){  
    queueq;  
    mapmpt;  
    __int64 n,m,p;  
    scanf("%I64d%I64d%I64d",&n,&m,&p);  
    for(int i=1;i<=n;i++)  
        scanf("%d",&a[i]);  
    int sum=0;  
    int len=1;  
    for(int i=1;i<=m;i++){  
        scanf("%d",&b[i]);  
        sum+=b[i];  
        if(mpt[b[i]]==0){  
            mpt[b[i]]=len;  
            len++;  
        }  
    }  
    for(int i=1;i<=m;i++){  
        num[mpt[b[i]]]++;  
    }  
    int x=0;  
    for(__int64 i=1;i<=p;i++){  
        if((i+p*(m-1))>n)break;  
        int ff=0;  
        int s=0;  
        for(int j=i;j<=n;j=j+p){  
            q.push(j);  
            num1[mpt[a[j]]]++;  
            ff++;  
            s+=a[j];  
            if(ff>
=m){ if(s==sum){ int flag=0; for(int k=1;k