zoukankan      html  css  js  c++  java
  • Codeforces Round #215 (Div. 1) B. Sereja ans Anagrams 匹配

    B. Sereja ans Anagrams

    Time Limit: 20 Sec

    Memory Limit: 256 MB

    题目连接

    http://codeforces.com/problemset/problem/367/B

    Description

    Sereja has two sequences a and b and number p. Sequence a consists of n integers a1, a2, ..., an. Similarly, sequence b consists of m integers b1, b2, ..., bm. As usual, Sereja studies the sequences he has. Today he wants to find the number of positions q (q + (m - 1)·p ≤ n; q ≥ 1), such that sequence b can be obtained from sequence aq, aq + p, aq + 2p, ..., aq + (m - 1)p by rearranging elements.

    Sereja needs to rush to the gym, so he asked to find all the described positions of q.

    Input

    The first line of the input data contains the single integer n (1 ≤ n ≤ 50) — the number of commands.

    Then follow n lines, each contains one command. Each of these lines contains either command pwd, or command cd, followed by a space-separated non-empty parameter.

    The command parameter cd only contains lower case Latin letters, slashes and dots, two slashes cannot go consecutively, dots occur only as the name of a parent pseudo-directory. The command parameter cd does not end with a slash, except when it is the only symbol that points to the root directory. The command parameter has a length from 1 to 200 characters, inclusive.

    Directories in the file system can have the same names.

    Output

    The first line contains three integers n, m and p (1 ≤ n, m ≤ 2·105, 1 ≤ p ≤ 2·105). The next line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109). The next line contains m integers b1, b2, ..., bm (1 ≤ bi ≤ 109).

    Sample Input

    5 3 1
    1 2 3 2 1
    1 2 3

    Sample Output

    2
    1 3

    HINT

    题意

    给你n个a[i],m个b[i],和P

    要求让你找到起点,使得a[pos],a[pos+p],a[pos+2*p]……,a[pos+(m-1)*p]和b数组一样

    题解:

    类似于km算法

    我们把b[i]表示为子串

    a[i]表示为母串

    因为不要求顺序,我们就直接跑就好了,只要匹配不是O(m*n)的都能过吧

    代码

    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <vector>
    #include <sstream>
    #include <queue>
    #include <typeinfo>
    #include <fstream>
    #include <map>
    #include <stack>
    typedef long long ll;
    using namespace std;
    //freopen("D.in","r",stdin);
    //freopen("D.out","w",stdout);
    #define sspeed ios_base::sync_with_stdio(0);cin.tie(0)
    #define test freopen("test.txt","r",stdin)
    #define maxn 1050005
    #define mod 10007
    #define eps 1e-9
    const int inf=0x3f3f3f3f;
    const ll infll = 0x3f3f3f3f3f3f3f3fLL;
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    //**************************************************************************************
    
    int a[maxn];
    int b[maxn];
    map<int,int> H;
    map<int,int> H1;
    vector<int> ans;
    int main()
    {
        int n=read(),m=read(),p=read();
        for(int i=1;i<=n;i++)
            a[i]=read();
        for(int i=1;i<=m;i++)
            b[i]=read(),H[b[i]]++;
        int pos;
        int flag=0;
        for(int i=1;i<=p;i++)
        {
            H1.clear(),pos=i,flag=0;;
            for(int j=i;j<=n;j+=p)
            {
                H1[a[j]]++,flag++;;
                if(H1[a[j]]>H[a[j]])
                {
                    for(int k=pos;k<=j;k+=p)
                    {
                        H1[a[k]]--,flag--;
                        if(a[j]==a[k])
                        {
                            pos=k+p;
                            break;
                        }
                    }
                    continue;
                }
                if(flag==m)
                {
                    ans.push_back(pos);
                    H1[a[pos]]--;
                    flag--;
                    pos+=p;
                }
            }
        }
        sort(ans.begin(),ans.end());
        cout<<ans.size()<<endl;
        for(int i=0;i<ans.size();i++)
            printf("%d ",ans[i]);
    
    }
  • 相关阅读:
    springboot常见应用属性
    springboot日志
    springboot注解
    2018年5月26日笔记
    LAMP环境搭建与配置
    2018年5月24日笔记
    2018年5月22日笔记
    2018年5月19日笔记
    2018年5月17日笔记
    2018年5月15日笔记
  • 原文地址:https://www.cnblogs.com/qscqesze/p/4618771.html
Copyright © 2011-2022 走看看