思路:
关于字符串匹配问题,考虑用KMP求解。
我们考虑将原来的字符串复制两次,求一遍KMP。
前一段即为原串,后一段就是复制两边后的串,
我们在KMP途中用f记录原串中有多少个与匹配串相匹配的,
用ans表示复制两次后有多少个与匹配串相匹配的。
最后将ans-f就可以得出每多复制一次增加的匹配数。
最后答案:
a
n
s
+
(
a
n
s
−
f
)
∗
(
n
−
2
)
ans + (ans - f) * (n - 2)
ans+(ans−f)∗(n−2)
#include <cstdio>
#include <iostream>
#define ll long long
using namespace std;
const ll N = 1e6 + 10;
string a, b;
ll n, ans, next[N], l1, l2, f;
void makeNext()
{
ll len = b.size();
next[0] = 0;
for(ll i = 1, k = 0; i < len; i++)
{
while(k > 0 && b[i] != b[k]) k = next[k - 1];
if(b[i] == b[k]) k++;
next[i] = k;
}
}
int main()
{
scanf("%lld", &n);
cin >> b >> a;
makeNext();
a+=a;
l1 = a.size(), l2 = b.size();
for(ll i = 0, j = 0; i < l1; i++)
{
while(j && b[j] != a[i]) j = next[j - 1];
if(b[j] == a[i]) j++;
if(j == l2)
{
if(i < l1 / 2) f++;
ans++;
}
}
// cout<<f<<endl;
printf("%lld\n", ans + (ans - f) * (n - 2));
return 0;
}