您的位置:首页 > 产品设计 > UI/UE

Number Sequence HDU - 1711 + 剪花布条 HDU - 2087 + Simpsons’ Hidden Talents HDU - 2594

2018-01-29 11:04 429 查看
推荐博客
kmp 点击打开链接
拓展kmp 点击打开链接

kmp模板
一 求首次出现位置 点击打开链接
#include <bits/stdc++.h>
using namespace std;

int num1[1000010],num2[10010],go[10010];
int n1,n2;

void kmp()
{
int i,j;
i=1,j=0;
while(i<=n2)
{
if(j==0||num2[i]==num2[j])
{
i++,j++;
go[i]=j;
}
else
{
j=go[j];
}
}
return;
}

void solve()
{
int i,j;
i=1,j=1;
while(i<=n1&&j<=n2)
{
if(j==0||num1[i]==num2[j])
{
i++,j++;
}
else
{
j=go[j];
}
}
if(j>=n2) printf("%d\n",i-n2);
else printf("-1\n");
return;
}

int main()
{
int t,i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n1,&n2);
for(i=1;i<=n1;i++)
{
scanf("%d",&num1[i]);
}
for(i=1;i<=n2;i++)
{
scanf("%d",&num2[i]);
}
kmp();
solve();
}
return 0;
}二 求出现次数 点击打开链接

#include <bits/stdc++.h>
using namespace std;

int go[1010];
int n1,n2;
char ch1[1010],ch2[1010];

void kmp()
{
int i,j;
go[0]=-1;
i=0,j=-1;
while(i<n2)
{
if(j==-1||ch2[i]==ch2[j])
{
i++,j++;
go[i]=j;
}
else j=go[j];
}
return;
}

void solve()
{
int i,j,ans;
i=0,j=0,ans=0;
while(i<n1)
{
if(j==-1||ch1[i]==ch2[j])
{
i++,j++;
if(j==n2)
{
j=0,ans++;
}
}
else j=go[j];
}
printf("%d\n", ans);
}

int main()
{
while(scanf("%s",ch1)!=EOF)
{
if(ch1[0]=='#') break;
scanf("%s",ch2);
n1=strlen(ch1),n2=strlen(ch2);
kmp();
solve();
}
return 0;
}三 拓展kmp 点击打开链接#include <bits/stdc++.h>
using namespace std;

int go1[50010],go2[50010];
int n1,n2;
char ch1[50010],ch2[50010];

void exkmp(int *go,int n,char *ch)
{
int i,j,pos;
go[0]=n;
i=0,pos=1;
while(ch[i]==ch[i+1]&&i+1<n) i++;
go[1]=i;
for(i=2;i<n;i++)
{
if(go[i-pos]+i<go[pos]+pos)
{
go[i]=go[i-pos];
}
else
{
j=go[pos]+pos-i;
if(j<0) j=0;
while(i+j<n&&ch[i+j]==ch[j]) j++;
go[i]=j;
pos=i;
}
}
return;
}

void solve()
{
int i,j,pos;
i=0,pos=0;
while(ch1[i]==ch2[i]&&i<n1&&i<n2) i++;
go1[0]=i;
for(i=1;i<n1;i++)
{
if(go2[i-pos]+i<go1[pos]+pos)
{
go1[i]=go2[i-pos];
}
else
{
j=go1[pos]+pos-i;
if(j<0) j=0;
while(ch1[i+j]==ch2[j]&&i+j<n1&&j<n2) j++;
go1[i]=j;
pos=i;
}
}
return;
}

int main()
{
int i,l;
while(scanf("%s%s",ch2,ch1)!=EOF)
{
n1=strlen(ch1),n2=strlen(ch2);
exkmp(go2,n2,ch2);
solve();
l=0;
for(i=0;i<n1;i++)
{
if(i+go1[i]==n1)
{
l=go1[i];
break;
}
}
if(l>0)
{
for(i=0;i<l;i++)
{
printf("%c",ch2[i]);
}
printf(" %d\n",l);
}
else
{
printf("0\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: