題意:給你兩個字符串,問你第一個字符串前綴和第二個字符串的後綴最長匹配長度是多少?
思路: 簡單的next數組的理解, 連接兩字符串,在連接處加一個無關字符,如‘*’,這樣做是爲了保證不會出現連接後前後綴最大匹配值大於某個字符串的情況,然後直接輸出next[strlen(str)]以及其前綴即可。
代碼如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=50005;
char p[maxn<<1];
char p1[maxn];
int NEXT[maxn<<1];
void Op_NEXT(int n){
NEXT[0] = -1;
int k = -1;
int j = 0;
while(j < n){
if(k == -1 || p[k] == p[j]){
j++;
k++;
NEXT[j] = k;
}
else{
k=NEXT[k];
}
}
}
int main()
{
ios::sync_with_stdio(false);
memset(NEXT,0,sizeof(NEXT));
while(cin>>p>>p1){
int len1=strlen(p);
int len2=strlen(p1);
strcat(p,p1);
int len=len1+len2;
Op_NEXT(len);
while(NEXT[len]>len1 || NEXT[len]>len2) len=NEXT[len];
int res=NEXT[len];
if(res){
for(int i=0;i<res;i++) cout<<p[i];
cout<<" "<<res<<endl;
}
else {
cout<<res<<endl;
}
}
return 0;
}