题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749

题意:给出两个数字串A、B。问A中有多少不相交的子串a能匹配B。匹配的意思是a中任意两个位置i和j的大小关系和B的这两个位置的大小关系是一样的。

思路:若是完全一模一样的匹配的话那么KMP是很好理解的。那么对于上述的比较方式怎么比较两个串相等呢?对于a的位置i和B的位置i,我们只要比较i之前a中a[i]的个数和B中B[i]的个数是否相等,以及a中小于a[i]的个数和B中小于B[i]的数字个数是否相等。只要每个位置都满足则这两个串匹配。

int f[N][30],g[N][30],next[N];
int a[N],b[N],n,m,K;
int visit[N];

int ok(int x,int y)
{
    if(g[x][b[x]]!=g[y][b[y]]-g[y-x][b[y]]) return 0;
    int cnt1=0,cnt2=0,i;
    for(i=1;i<b[x];i++) cnt1+=g[x-1][i];
    for(i=1;i<b[y];i++) cnt2+=g[y-1][i];
    for(i=1;i<b[y];i++) cnt2-=g[y-x][i];
    return cnt1==cnt2;
}

void getNext()
{
    next[1]=0;
    int i,j=0;
    for(i=2;i<=m;i++)
    {
        while(j&&!ok(j+1,i)) j=next[j];
        if(ok(j+1,i)) j++;
        next[i]=j;
    }
}

int ok1(int x,int y)
{
    if(g[x][b[x]]!=f[y][a[y]]-f[y-x][a[y]]) return 0;
    int cnt1=0,cnt2=0,i;
    for(i=1;i<b[x];i++) cnt1+=g[x-1][i];
    for(i=1;i<a[y];i++) cnt2+=f[y-1][i];
    for(i=1;i<a[y];i++) cnt2-=f[y-x][i];
    return cnt1==cnt2;
}

void kmp()
{
    int i,j=0;
    for(i=1;i<=n;i++)
    {
        while(j&&!ok1(j+1,i)) j=next[j];
        if(ok1(j+1,i)) j++;
        if(j==m) visit[i]=1,j=next[j];
    }
}

int main()
{
    while(cin>>n>>m>>K)
    {
        clr(f,0); clr(g,0); clr(visit,0);
        int i,j;
        FOR1(i,n)
        {
            RD(a[i]);
            FOR1(j,K) f[i][j]=f[i-1][j];
            f[i][a[i]]++;
        }
        FOR1(i,m)
        {
            RD(b[i]);
            FOR1(j,K) g[i][j]=g[i-1][j];
            g[i][b[i]]++;
        }
        getNext();
        kmp();
        int ans=0;
        i=1;
        while(i<=n)
        {
            if(visit[i]) i+=m,ans++;
            else i++;
        }
        PR(ans);
    }
}

  

HDU4749 Parade Show(KMP)的更多相关文章

  1. poj2406 Power Strings(kmp)

    poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include & ...

  2. POJ 2406 Power Strings(KMP)

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

  3. LightOJ 1258 Making Huge Palindromes(KMP)

    题意 给定一个字符串 \(S\) ,一次操作可以在这个字符串的右边增加任意一个字符.求操作之后的最短字符串,满足操作结束后的字符串是回文. \(1 \leq |S| \leq 10^6\) 思路 \( ...

  4. codeM编程大赛E题 (暴力+字符串匹配(kmp))

    题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时. ...

  5. 经典串匹配算法(KMP)解析

    一.问题重述 现有字符串S1,求S1中与字符串S2完全匹配的部分,例如: S1 = "ababaababc" S2 = "ababc" 那么得到匹配的结果是5( ...

  6. URAL 1732 Ministry of Truth(KMP)

    Description In whiteblack on blackwhite is written the utterance that has been censored by the Minis ...

  7. Leetcode28--->字符串的匹配(KMP)

    题目: 题目的本质是给定两个字符串str1,str2,求str1中的str2串开始的地方,即字符串的匹配,KMP算法 思路:时间复杂度为O(m + n),空间复杂度为O(n),原串的长度为m,子串的长 ...

  8. 题解0012:剪花布条(KMP)

    信奥一本通1465 KPM例题 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目描述:给出花布条和小饰条(字符串),求花布条中能剪 ...

  9. BZOJ 3796 Mushroom追妹纸 哈希+二分(+KMP)

    先把两个串能匹配模式串的位置找出来,然后标记为$1$(标记在开头或末尾都行),然后对标记数组求一个前缀和,这样可以快速查到区间内是否有完整的一个模式串. 然后二分子串(答案)的长度,每次把长度为$md ...

随机推荐

  1. 【POJ】【3680】Intervals

    网络流/费用流 引用下题解: lyd: 首先把区间端点离散化,设原来的数值i离散化后的标号是c[i].这样离散化之后,整个数轴被分成了一段段小区间. 1.建立S和T,从S到离散化后的第一个点连容量K, ...

  2. 推荐系统之LFM(二)

    对于一个用户来说,他们可能有不同的兴趣.就以作者举的豆瓣书单的例子来说,用户A会关注数学,历史,计算机方面的书,用户B喜欢机器学习,编程语言,离散数学方面的书, 用户C喜欢大师Knuth, Jiawe ...

  3. 科学技术法转成BigDemcial

    目的:将类似“-412615050624334534247E-3”转成“-412615050624334534.247” 工具:用到BigDemcial Code: public static voi ...

  4. phonegap/cordova常用命令

    创建项目 cordova create foldername com.wps.test projectName cd foldername 基本设备信息 设备 API: cordova plugin ...

  5. 操作集合的工具类Collections

    1       操作集合的工具类Collections Java提供了一个操作Set.List和Map等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操 ...

  6. VS Bug 当获取其他项目的代码时, F5 无法进入调试模式. 也不报错....

    在64位的机子下, 被获用的项目使用X86时会出现. 就会出现   F5 无法进入调试模式. 也不报错.... 打断点也没有用. 在不加入X86项目的代码时, 又可以运行..   解决方案:   检查 ...

  7. 浅谈MySQL索引背后的数据结构及算法【转】

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  8. python 安装 管理包 pip

    2.7的坑里出不来了,现在已经换到3.4了,不存在下列问题. win7下安装pip    http://blog.chinaunix.net/uid-24984661-id-4202194.html ...

  9. 简约的单页应用引擎:sonnyJS

    点这里 SonnyJS是一个简约的单页应用引擎和HTML预处理器,旨在帮助开发人员和设计人员创建难以置信的强大和快速的单页网站. 主要特性: 模板嵌套,模板继承 动态同步模板路由(非Ajax) 跨窗口 ...

  10. Thread类详解

    java.lang 类 Thread java.lang.Object java.lang.Thread 所有已实现的接口: Runnable public class Threadextends O ...