KMP简单应用

题目描述

给定两个字符串string1和string2,判断string2是否为string1的子串。

输入

 输入包含多组数据,每组测试数据包含两行,第一行代表string1(长度小于1000000),第二行代表string2(长度小于1000000),string1和string2中保证不出现空格。

输出

 对于每组输入数据,若string2是string1的子串,则输出string2在string1中的位置,若不是,输出-1。

示例输入

abc
a
123456
45
abc
ddd

示例输出

1
4
-1
 
 
最简单的模版
#include <stdio.h>
#include <string.h>
#define N 1000005
char a[N],b[N];
int next[N];
void getnext()
{
    int len,i=0,j=-1;
    len=strlen(b);
    next[0]=-1;
    while(i<len)
    {
        if(j==-1||b[i]==b[j])
        {
            i++;
            j++;
            next[i]=j;
        }
        else
            j=next[j];
    }
}
int get()
{
    int i=0,j=0;
    int len1,len2;
    len1=strlen(a);
    len2=strlen(b);
    while(i<len1&&j<len2)
    {
        if(j==-1||a[i]==b[j])
        {
            ++i;
            ++j;
        }
        else
            j=next[j];
    }
    if(j>=len2)
        return i-len2+1;
    else
        return -1;
}
int main()
{
    int s;
    while(scanf("%s",a)!=EOF)
    {

        scanf("%s",b);
        getnext();
        s=get();
        printf("%d\n",s);
    }
}




#include<stdio.h>
#include<string.h>
void getnext(char *a,int *next);
int idekmp(char*s,char *a);
int next[1000002];
char a[1000002],s[1000002];
int main()
{
    int m,i,j;
    while(scanf("%s",s)!=EOF)
    {
        scanf("%s",a);
        getnext(a,next);
        m=idekmp(s,a);
        if(m!=0)
            printf("%d\n",m);
        else
            printf("-1\n");
    }
    return 0;
}
int idekmp(char*s,char *a)
{
    int i=0,j=0,n,m,x=0;
    n=strlen(s);
    m=strlen(a);
    while(i<n&&j<m)
    {
        if(j==0||s[i]==a[j])
        {
            i++;
            j++;

        }
        else
        {
            if(a[j]==0)
            {
                j=0;
                i++;
                x=i;
            }
            else
            {
                j=next[j];
                x=i-j;
            }
        }
    }
    if(j>=strlen(a))
        return x+1;
    else
        return 0;
}
void getnext(char *a,int *next)
{
    int i=1,j=0,r;
    r=strlen(a);
    next[0]=next[1]=0;
    while(i<r)
    {
        if(j==0||a[i]==a[j])
        {
            i++;
            j++;
            next[i]=j;
        }
        else j=next[j];
    }
}
这段代码是我一不小心把if(next[j]==0)<span style="font-family: Arial, Helvetica, sans-serif;">写成了if(a[j]==0)</span><span style="font-family: Arial, Helvetica, sans-serif;">但是对了,虽然我不明白为什么对了</span>
<pre code_snippet_id="183536" snippet_file_name="blog_20140211_1_496344" class="html" name="code">#include<stdio.h>
#include<string.h>
void getnext(char *a,int *next);
int idekmp(char*s,char *a);
int next[1000002];
char a[1000002],s[1000002];
int main()
{
    int m,i,j;
    while(scanf("%s",s)!=EOF)
    {
        scanf("%s",a);
        getnext(a,next);
        m=idekmp(s,a);
        if(m!=0)
            printf("%d\n",m);
        else
            printf("-1\n");
    }
    return 0;
}
int idekmp(char*s,char *a)
{
    int i=0,j=0,n,m,x=0;
    n=strlen(s);
    m=strlen(a);
    while(i<n&&j<m)
    {
        if(j==0||s[i]==a[j])
        {
            i++;
            j++;

        }
        else
        {
            if(next[j]==0)//刚开始把这个地方忘记了,后来明白了,j是从1计数的不能0,所以这各地方就是把j指向a的第一个输的位置
            {
                j=1;
                i++;
                x=i-j;
            }
            else
            {
                j=next[j];
                x=i-j;
            }
        }
    }
    if(j>=strlen(a))
        return x+1;
    else
        return 0;
}
void getnext(char *a,int *next)
{
    int i=1,j=0,r;
    r=strlen(a);
    next[0]=next[1]=0;
    while(i<r)
    {
        if(j==0||a[i]==a[j])
        {
            i++;
            j++;
            next[i]=j;
        }
        else j=next[j];
    }
}
#include<stdio.h>
#include<string.h>
int next[1000002];
char a[1000002],b[1000002];
int NE(char *b,int *next)
{
    int i=0,j=-1,n;
    n=strlen(b);
    next[0]=next[1]=-1;
    while(i<n)
    {
        if(j==-1||b[i]==b[j])
        {
            i++;
            j++;
            next[i]=j;
        }
        else
            j=next[j];

    }
}
int ge(char *a,char *b)
{
    int i=0,j=0,n,m,x=0;
    n=strlen(a);
    m=strlen(b);
    while(i<n&&j<m)
    {
        if(j==0||a[i]==b[j])
        {
            i++;
            j++;

        }
        else
        {
                j=next[j];
                x=i-j;
        }
    }
    if(j>=m)
        return x+1;
    else
        return 0;

}
int main()
{
    int m;
    while(scanf("%s",a)!=EOF)
    {
        scanf("%s",b);
        NE(b,next);
        m=ge(a,b);
        if(m!=0)
            printf("%d\n",m);
        else
            printf("-1\n");
    }
    return 0;
}

 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
森林防火应急联动指挥系统是一个集成了北斗定位/GPS、GIS、RS遥感、无线网络通讯、4G网络等技术的现代化智能系统,旨在提高森林火灾的预防和扑救效率。该系统通过实时监控、地图服务、历史数据管理、调度语音等功能,实现了现场指挥调度、语音呼叫通讯、远程监控、现场直播、救火人员生命检测等工作的网络化、智能化、可视化。它能够在火灾发生后迅速组网,确保现场与指挥中心的通信畅通,同时,系统支持快速部署,适应各种极端环境,保障信息的实时传输和历史数据的安全存储。 系统的设计遵循先进性、实用性、标准性、开放性、安全性、可靠性和扩展性原则,确保了技术的领先地位和未来的发展空间。系统架构包括应急终端、无线专网、应用联动应用和服务组件,以及安全审计模块,以确保用户合法性和数据安全性。部署方案灵活,能够根据现场需求快速搭建应急指挥平台,支持高并发视频直播和大容量数据存储。 智能终端设备具备三防等级,能够在恶劣环境下稳定工作,支持北斗+GPS双模定位,提供精确的位置信息。设备搭载的操作系统和处理器能够处理复杂的任务,如高清视频拍摄和数据传输。此外,设备还配备了多种传感器和接口,以适应不同的使用场景。 自适应无线网络是系统的关键组成部分,它基于认知无线电技术,能够根据环境变化动态调整通讯参数,优化通讯效果。网络支持点对点和点对多点的组网模式,具有低功耗、长距离覆盖、强抗干扰能力等特点,易于部署和维护。 系统的售后服务保障包括安装实施服务、系统维护服务、系统完善服务、培训服务等,确保用户能够高效使用系统。提供7*24小时的实时故障响应,以及定期的系统优化和维护,确保系统的稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值