zoukankan      html  css  js  c++  java
  • hdu1711(终于搞懂了KMP算法了。。)


    题意:给你两个长度分别为n(1 <= N <= 1000000)和m(1 <= M <= 10000)的序列a[]和b[],求b[]序列在a[]序列中出现的首位置。如果没有请输出-1。


    这题用裸KMP算法O(N)水过~

    KMP算法的两个函数:



    Code(hdu1711):

    #include <stdio.h>
    #include <string.h>
    
    const int maxn = 1000005;
    const int maxm = 10005;
    int a[maxn], b[maxm], next[maxm];
    int n, m;
    
    void Read()
    {
        int i;
        scanf("%d%d",&n, &m);
        for(i=0; i<n; i++) scanf("%d", &a[i]);
        for(i=0; i<m; i++) scanf("%d", &b[i]);
    }
    
    void Get_Next()
    {
        int i, j;
        i = 0;
        next[0] = -1;
        j = -1;
        while(i<m) {
            if(j==-1||b[i]==b[j]) {
                i++;
                j++;
                next[i] =j;
            } else {
                j = next[j];
            }
        }
    }
    
    int Kmp()
    {
        int i, j;
        i = 0;
        j = 0;
        while(i<n&&j<m) {
            if(j==-1||b[j]==a[i]) {
                i++;
                j++;
            } else {
                j=next[j];
            }
        }
        if(j>=m)
            return i - j + 1;
        else
            return -1;
    }
    
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--) {
            Read();
            Get_Next();
            int ans = Kmp();
            printf("%d
    ",ans);
        }
        return 0;
    }


  • 相关阅读:
    POJ测试数据合集
    POJ1724ROADS
    关闭进程的数据库
    config上传设置
    tfs 撤销挂起的更改
    cn_visual_studio_team_foundation_server_2010_x86_x64_dvd_531909
    js 中文转义
    文件下载乱码
    杀死数据库进程
    Python基础综合练习
  • 原文地址:https://www.cnblogs.com/pangblog/p/3279833.html
Copyright © 2011-2022 走看看