您的位置:首页 > 其它

hdoj 2087 剪花布条(kmp)

2016-10-08 13:49 281 查看
题意:给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?

kmp模板题,数据很弱,暴力也能过。

kmp代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1005;
char s[maxn], t[maxn];
int Next[maxn], ans;

void makeNext(void)
{
int len = strlen(s);
Next[0] = Next[1] = 0;
for(int i = 1; i < len; i++)
{
int j = Next[i];
while(j && s[i] != s[j]) j = Next[j];
Next[i+1] = s[i]==s[j] ? j+1 : 0;
}
}

void kmp(void)
{
int len1 = strlen(s);
int len2 = strlen(t);
int i, j = 0;
for(int i = 0; i < len1; i++)
{
while(j && s[i] != t[j]) j = Next[j];
if(s[i] == t[j]) j++;
if(j == len2) ans++, j = 0;
}
}

int main(void)
{
while(~scanf(" %s", s))
{
if(strlen(s) == 1 && s[0] == '#') break;
scanf(" %s", t);
ans = 0;
makeNext();
kmp();
printf("%d\n", ans);
}
return 0;
}


暴力代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1005;
char str[maxn], tstr[maxn];
int main(void)
{
while(~scanf(" %s", str))
{
if(strlen(str) == 1 && str[0] == '#') break;
scanf(" %s", tstr);
int len1 = strlen(str);
int len2 = strlen(tstr);
int ans = 0;
for(int i = 0; i < len1; i++)
{
if(str[i] == tstr[0])
{
int j;
for(j = 0; i+j < len1 && j < len2; j++)
if(tstr[j] != str[i+j]) break;
if(j >= len2) ans++, i = i+j-1;
}
}
printf("%d\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  kmp hdoj 算法