【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);
		}
 
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章