作者 陈晓梅
单位 广东外语外贸大学
给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置。
输入格式:
输入有两行:
第一行是主串S;
第二行是模式T.
输出格式:
输出相匹配的子串中的第一个字符在主串S中出现的位置。若匹配失败,输出0.
输入样例:
在这里给出一组输入。例如:
aaaaaba
ba
输出样例:
在这里给出相应的输出。例如:
6
代码如下:
/*全局变量,全局数组,静态数组(static)则是开在全局区(静态区)(static)。大小为2G,所以能够开的很大;*/
/* 函数内申请的变量,数组,是在栈(stack)中申请的一段连续的空间。
栈的默认大小为2M或1M,开的比较小;*/
#include<stdio.h>
char b[100000010],a[100000010];
int next[100000010];
int main(void)
{
int i,j;
scanf("%s",a);
scanf("%s",b);
next[0]=0;
for(i=1,j=0;b[i]!='\0';i++)
{
while(j>0&&b[i]!=b[j])
{
j=0;
}
if(b[j]==b[i])
j++;
next[i]=j;
}
for(i=0,j=0;a[i]!='\0';i++)
{
while(j>0&&a[i]!=b[j])
{
j=next[j-1];
}
if(a[i]==b[j])
j++;
if(b[j]=='\0')
{
printf("%d",i-j+2);
break;
}
}
if(b[j]!='\0')
printf("0");
return 0;
}