萌新求助为啥全部RE啦 第一个点下载对过了,本地是对的
查看原帖
萌新求助为啥全部RE啦 第一个点下载对过了,本地是对的
452688
cywuuuu楼主2021/2/5 20:50
#include <stdio.h>
#include <string.h>
int next[1000000];	char s1[1000000],s2[1000000];
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int gennext(int *next,char *s2)
{
	next[0]=0;
	int len=0;
	for(int i = 1;i < strlen(s2); i++)
	{
		while(len!=0&&s2[i]!=s2[len])//注意啦!! len若可以为0 则开始会被卡住  //不匹配但是小了没准可以
		//针对一个 i (及i处的真前后缀匹配)(i trasverse through the whole)  用while 往前跳  
			len=next[len];
		if(s2[i]==s2[len]){
			len++;
			next[i]=len;//匹配了就+1; 
		}
		
		
	}
}

int kmp(char *s1, char *s2)
{
	int i=0,j=0;
	for( i = 0;i < strlen(s1);i++)//i一直动着 ,没必要匹配成功了,i在回去,j会自动调整的 
	{
		
		while(j!=0 && s1[i]!=s2[j])//调整移动时 i 不变  
		{
			j=next[j-1];
		}	
		
		if(s1[i]==s2[j])
		{
			j++; 
		}
		if(j==strlen(s2))
		{
			printf("%d\n",i-strlen(s2)+2);j=next[j-1];
		}
	}
}

int main(int argc, char** argv) {
	scanf("%s",s1);
	scanf("%s",s2); 
	gennext(next, s2);
	kmp(s1,s2);
	for(int i=0;i<strlen(s2);i++)
	{
		printf("%d ",next[i]);
	}
	
	
	return 0;
}
```****
2021/2/5 20:50
加载中...