#include <iostream> #include <cstring> using namespace std; char s[1000],p[1000]; inline int getans(char* s,char* p){ int sl=strlen(s),pl=strlen(p); int i=0,j=0; while(i<sl && j<pl){ if(s[i]==p[j]) i++,j++; else{ i=i-j+1; j=0; } } if(j==pl) return i-j; else return -1; } int main(){ cin>>s>>p; int ans=getans(s,p); cout<<ans<<endl; return 0; }
inline int KMPsearch(char* s,char* p){ int sl=strlen(s),pl=strlen(p); int i=0,j=0; while(i<sl && j<pl){ if(s[i]==p[j]||j==-1)//j==-1表示匹配成功,进行后续的字符匹配 i++,j++; else j=nxt[j];//i不用变,j直接跳到预处理好的next[j]处 } if(j==pl) return i-j; else return -1; }
1.
2.
如果相等,则该位的next值就是前一位的next值加上1;
如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
3.
inline void GetNext2(char *p,int nxt[]){ int pl=strlen(p); nxt[0]=-1; int k=-1; int j=0; while(j<pl-1){ if(k==-1 || p[j]==p[k]){ ++j,++k; if(p[j]!=p[k]) nxt[j]=k; else nxt[j]=nxt[k]; } else k=nxt[k]; } }
Third.对于next数组的优化:
Finally.整体代码(可直接食用哦):
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; char s[100],p[100]; int nxt[100]; inline void GetNext2(char *p,int nxt[]){ int pl=strlen(p); nxt[0]=-1; int k=-1; int j=0; while(j<pl-1){ if(k==-1 || p[j]==p[k]){ ++j,++k; if(p[j]!=p[k]) nxt[j]=k; else nxt[j]=nxt[k]; } else k=nxt[k]; } } inline int KMPsearch(char* s,char* p){ int sl=strlen(s),pl=strlen(p); int i=0,j=0; while(i<sl && j<pl){ if(s[i]==p[j]||j==-1) i++,j++; else j=nxt[j]; } if(j==pl) return i-j; else return -1; } int main(){ cin>>s>>p; GetNext2(p,nxt); int ans=KMPsearch(s,p); cout<<ans<<'\n'; return 0; }
嗯,真香