以下是几种类型题:
A.类型1:匹配子字符串在母串中第几个位置开始出现。
B.类型2:子串在母串中出现了几次(可以有重复的)。
eg:子串:AZA
母串:AZAZAZA
ans = 3;
C.类型3:母串中最多有几个子串。
D.类型4:需要再补几个字符能构成一个类似手链那样循环相同的。
eg:abca ->2
abcde->5
aaa->0
E.类型5:给出一字符串,找出由2个或2个以上相同的子字符串组成的前缀,输出前缀长度及其相同的子字符串数。
F.类型6:当前最小循环节中字符串的个数(不可以补字符串)。
G.类型7:求最小循环节有几个。
一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案。对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢?
abcde a3 aaaaaa aa #
0 3
AC代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int pext[1005] = {-5};
char t[1005];
char s[1005];
int len1,len2;
void get_next(int len2)
{
int j = 1;
int k = 0;
pext[1] = 0;
while(j < len2)
{
if((k == 0)||(s[j] == s[k]))
{
k++;
j++;
pext[j] = k;
}
else
{
k = pext[k];
}
}
}
int get_KMP(int len2,int len1,int pos)
{
int i,j;
int ans = 0;
i=1,j=1;
while(i<=len1)
{
if((j==0)||(t[i] == s[j]))
{
++i;
++j;
}
else
{
j = pext[j];
}
if(j > len2){
ans++;
j = 1;
}
}
return ans;
}
int main()
{
int i;
int pos = 0;
while(1)
{
int ans = 0;
scanf("%s",t+1);
len1 = strlen(t+1);
if(t[1] == '#')
{
return 0;
}
else
{
scanf("%s",s+1);
len2 = strlen(s+1);
get_next(len2);
ans = get_KMP(len2,len1,pos);
printf("%d\n",ans);
}
}
return 0;
}