(2012-07-14 21:16:23)
关于Sunday算法的介绍见百度百科。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int sunday(char *text,char *pattern)
{
int temp[256];
int *shift=temp;
int i;
int lP=strlen(pattern);
int lT=strlen(text);
for(i=0;i<256;i++)
*(shift+i)=lP+1;
for(i=0;i<lP;i++)
*(shift+int(*(pattern+i)))=lP-i;
int limit=lT-lP+1;
int result=0;
for(i=0;i<limit;i+=shift[text[i+lP]])
if(text[i]==*pattern)
{
char*match_text=text+i+1;
int match_size=1;
do
{
if(match_size==lP)
result++;
}while((*match_text++)==pattern[match_size++]);
}
return result;
}
char text[1000005];
char pattern[1000005];
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
scanf("%s%s",text,pattern);
printf("%d\n",sunday(text,pattern));
}
return 0;
}