【KMP】 专题

HDU 1711

#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
int a[maxn],b[maxn];
int tlen,slen;
int nxt[maxn];
void getNext()
{
	int j=0,k=-1;
	nxt[0]=-1;
	while(j<tlen)
	{
		if(k==-1||b[j] == b[k])
		 nxt[++j]=++k;
		else
		 k=nxt[k];
		 
	}
}

int solve()
{
	getNext();
	int i=0,j=0;
	while(i<slen&&j<tlen) 
	{
		if(j==-1||a[i]==b[j])
		{
			i++;j++; 
		} 
		else j=nxt[j];
	}
	 
	if(j==tlen) return i-tlen+1;
	else return -1;
	 
} 

int main()
{
		int cas;cin>>cas;
		while(cas--)
		{
			scanf("%d%d",&slen,&tlen);
			for(int i=0;i<slen;i++) scanf("%d",&a[i]);
			for(int i=0;i<tlen;i++) scanf("%d",&b[i]);
			printf("%d\n",solve());
		}
 
} 

HDU 1686

#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
char a[maxn],b[maxn];
int tlen,slen;
int nxt[maxn];
void getNext()
{
	int j=0,k=-1;
	nxt[0]=-1;
	while(j<tlen)
	{
		if(k==-1||b[j] == b[k])
		 nxt[++j]=++k;
		else
		 k=nxt[k];
		 
	}
}

int solve()
{

	int ans=0;
	if(slen==1&&tlen==1)
	{
		if(a[0]==b[0]) return 1;
		else return 0;
		
	}
		getNext();
	int j=0;
	for(int i=0;i<slen;i++)
	{
		while(j>0&&a[i]!=b[j])
			j=nxt[j];
		if(a[i]==b[j]) j++;
		if(j == tlen) 
		{
			ans++;
			j=nxt[j];
		}
		 
	}
	return ans;
	 
} 

int main()
{
		int cas;cin>>cas;
		while(cas--)
		{
			scanf("%s%s",b,a);
			slen=strlen(a);
			tlen=strlen(b);
			printf("%d\n",solve());
		}
 
} 

hdu 2087

#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
char a[maxn],b[maxn];
int tlen,slen;
int nxt[maxn];
void getNext()
{
    int j=0,k=-1;
    nxt[0]=-1;
    while(j<tlen)
    {
        if(k==-1||b[j] == b[k])
         nxt[++j]=++k;
        else
         k=nxt[k];
         
    }
}

int solve()
{
    getNext();
    int ans=0;
    int i=0,j=0;
    while(i<slen)
    {
        if(j==-1||a[i]==b[j])
        {
            i++;j++;
            if(j==tlen)
            {
                ans++;
                j=0;
            }
        }
        else j=nxt[j];
    }
    
    return ans;
     

int main()
{
     
        while(scanf("%s",a)!=EOF&&strcmp(a,"#"))
        {
            
            scanf("%s",b);
            tlen=strlen(b);
            slen=strlen(a);             
            printf("%d\n",solve());
        }
 

 

 

hdu 2752

#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 1000005
using namespace std;
char a[maxn],b[maxn];
int tlen,slen;
int nxt[maxn];
int ans[maxn];
void getNext()
{
	int j=0,k=-1;
	nxt[0]=-1;
	while(j<tlen)
	{
		if(k==-1||b[j] == b[k])
		 nxt[++j]=++k;
		else
		 k=nxt[k];
		 
	}
}

void solve()
{
	getNext();
	
	int t=nxt[tlen-1];
	int cnt=0;
	while(t!=-1)
	{
		if(b[t] == b[tlen-1])
		{
			ans[cnt++]=t+1;
		}
		t=nxt[t];
	}
	 
	for(int i=cnt-1;i>=0;i--)
	{
		printf("%d ",ans[i]);
	}
	printf("%d\n",tlen);
} 

int main()
{
	 
		while(scanf("%s",b)!=EOF)
		{
			tlen=strlen(b);
			solve();
			
			
		}
 
} 

hdu 3336

#include<bits/stdc++.h>
#define maxn 1000005
using namespace std;
char a[maxn],b[maxn];
int tlen,slen;
int nxt[maxn];
long long res;
void getNext()
{
	int j=0,k=-1;
	nxt[0]=-1;
	while(j<tlen)
	{
		if(k==-1||b[j] == b[k])
		 nxt[++j]=++k;
		else
		 k=nxt[k];
		 
	}
}

int solve()
{

	 
	 
} 

int main()
{
		int cas;cin>>cas;
		while(cas--)
		{
			
			 scanf("%d",&tlen);
			 scanf("%s",b);
			 getNext();
			 res = nxt[tlen] + tlen;
			 
			 for(int j = 0; j < tlen; j++)
			 {
			 	if(nxt[j] > 0 && nxt[j]+1!=nxt[j+1])
				 	res+=nxt[j]	;
			 }  
			 
			 printf("%lld\n",res%10007);
		}
 
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的影城管理系统,源码+数据库+论文答辩+毕业论文+视频演示 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多生活之中,随之就产生了“小徐影城管理系统”,这样就让小徐影城管理系统更加方便简单。 对于本小徐影城管理系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据小徐影城管理系统的现状来进行开发的,具体根据现实的需求来实现小徐影城管理系统网络化的管理,各类信息有序地进行存储,进入小徐影城管理系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台;首页、电影信息、电影资讯、个人中心、后台管理、在线客服等功能。 本论文主要讲述了小徐影城管理系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的小徐影城管理系统状况,提高管理效率。 关键词:小徐影城管理系统;Spring Boot框架,MySQL数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值