最近学习了KMP算法
发现只是会做一下KMP的模板裸题
并没有很深入了理解这个算法
而这一题(题目链接)可以很好的帮助理解KMP算法中next数组的真正内涵和运用
思路及知识点:1.next数组存的是该位置最长相同前后缀的长度
2.为了防止拼接后的字符串越过两个原串的边界,在中间加一个唯一的字符隔开
以下是AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f
ll nt[inf];
void Next(string s)
{
ll i=0;
ll j=-1;
nt[0]=-1;
while(i<s.size())
{
if(j==-1||s[i]==s[j])
{
i++;j++;nt[i]=j;
}
else j=nt[j];
}
}
int main()
{
ll n;
while(cin>>n)
{
string v[n];
for(ll i=0;i<n;i++) cin>>v[i];
ll q;
cin>>q;
while(q--)
{
ll l,r;
cin>>l>>r;
string s=v[r-1]+'@'+v[l-1];
Next(s);
cout<<nt[s.size()]<<endl;
}
}
}