64,648
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <string.h>
using namespace std;
char str[1000005],pattern[20];
int next[20];
int plen,slen;
void getNext(char *pattern)
{
int i=0,j=-1;
next[0]=-1;
while( i < plen )
{
if( j==-1 || pattern[i] == pattern[j])
{
++i,++j;
next[i]=j;
}
else
{
j=next[j];
}
}
}
char* kmp(char *str, char *pattern)
{
if (!(*pattern) || !(*str))
return NULL;
int i=0,j=0;
getNext(pattern);
while( i < slen && j < plen )
{
if( j== -1 || str[i] == pattern[j] )
{
++i;
++j;
}
else
{
j=next[j];
}
}
if( j == plen )
return str + i-j;
else
return NULL;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif
int n,sum;
char *p = NULL;
scanf("%d",&n);
while (n--)
{
scanf("%s%s",str,pattern);
slen = strlen(str);
plen=strlen(pattern);
p = str, sum=0;
while (p = kmp(p,pattern)) //str+p可能越界了
{
++sum;
p += plen;
}
cout << sum << endl;
}
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
char str[1000005],pattern[20];
int main()
{
#ifndef ONLINE_JUDGE
freopen("2.txt","r",stdin);
#endif
int n,sum,len;
char *p = NULL;
scanf("%d",&n);
while (n--)
{
scanf("%s%s",str,pattern);
p = str;
sum = 0,len = strlen(pattern);
while (p = strstr(p,pattern))
{
++sum;
p += len;
}
cout << sum << endl;
}
return 0;
}