#include<iostream>
#include<cstring>
using namespace std;
char s[10005],p[10005];
int next[100005];//存储每一次匹配不成功时应该从短串的next[i]处重新开始匹配
int kmp(char* s,char* p){//s为长串,p为短串
int i=0;//在长串上
int j=0;//在短串上
int slen=strlen(s);//长串长度
int plen=strlen(p);//短串长度
while(i<slen&&j<plen){
if(j==-1||s[i]==p[j]){//如果j==-1或者匹配成功的话,i和j一起右移再进行匹配
i++;
j++;
}
else{
j=next[j];//短串右移j-next[j]位,再循环进行匹配
}
}
if(j==plen){//说明匹配完全成功
return i-j;//返回第一个位置
}
else
return -1;
}
void fun(char* p,int next[]){
int plen=strlen(p);
next[0]=-1;//初始值为-1
int k=-1;
int j=0;
while(j<plen-1){
if(k==-1||p[j]==p[k]){//说明当前字符匹配成功
++k;
++j;
if(p[j]!=p[k]){//如果下一对字符不对称
next[j]=k;//下一个next值就为当前的最大匹配长度(相当于右移一位)
}
else{//如果下一对字符对称
next[j]=next[k];//优化,abacababac与abab匹配时浪费的时间
}
}
else{//说明当前字符匹配失败
k=next[k];
}
}
}
int main(){
return 0;
}