一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
Input
输入中含有一些数据,分别是成对出现的花布条和小饰条,其布条都是用可见ASCII字符表示的,可见的ASCII字符有多少个,布条的花纹也有多少种花样。花纹条和小饰条不会超过1000个字符长。如果遇见#字符,则不再进行工作。
Output
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行。
Sample Input
abcde a3
aaaaaa aa
#
Sample Output
0
3
题意:问第一个字符串包含几个第二个字符串。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
#include<cmath>
char par[1005];
char son[1005];
int next[1005];
int len1, len2;
//得到next字符串匹配长度数组;next [j] = k,代表j之前的字符串中有最大长度为k 的相同前缀后缀。
void getnnext()
{
int i, j;
i = 1;
j = 0;
next[1] = 0;
while(i<len1)
{
//如果匹配成功,或者匹配位置已经到了子串的最开始;
if(j==0||son[i]==son[j])
{
i++;
j++;
next[i] = j;
}
//否则将子串后拉至匹配不成功的地方 (该地方的下标要与后拉前的next[i]值一致);
//因为父串与子串不匹配一位前的 几位是匹配的,而匹配的这几位 如果有相同前缀后缀,
//(相同前缀后缀的位数)即next数组的值就可以不用从子串的头开始比,直接拿相同前缀的后一位与父串比即可。
//****(在处理子串的前缀后缀得到next数组时,后缀的next数组的值与前缀的字符串下标值是一致的(除不与1连着的0) )
else
j = next[j];
}
}
int KMP()
{
int i=1, j=1, cnt = 0;
while(i<=len1)
{
if(j==0||par[i]==son[j])
{
i++;
j++;
}
else
j = next[j];
if(j>len2)
{
cnt++;
j = 1;
};
}
return cnt;
}
int main()
{
int i, j, ans;
while(scanf("%s", par+1)!=EOF)
{
if(par[1]=='#')
return 0;
scanf("%s", son+1);
len1 = strlen(par+1);
len2 = strlen(son+1);
getnnext();
ans = KMP();
printf("%d\n",ans);
}
return 0;
}