https://ac.nowcoder.com/acm/contest/15593/H
比赛的时候没做出来(赛后看题解 牛逼em tire树板子题)
将T串的所有后缀插入字典树,用S串的所有后缀去查匹配失败的总次数就是答案。
后缀插入操作(真的学到了)
for(int i=0; i<m; i++)
{
insert(b+i);
// cout<<b+i<<endl;
}
code:
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3+10;
int son[N*N][26];
char a[N],b[N];
int idx;
void insert(string str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u]) son[p][u] = ++ idx;
p = son[p][u];
}
// cnt[p] ++ ;
}
int query(string str)
{
int p = 0;
for (int i = 0; str[i]; i ++ )
{
int u = str[i] - 'a';
if (!son[p][u])
return str.length()-i;
p = son[p][u];
}
return 0;
}
int main()
{
int n,m;
cin>>n>>m;
scanf("%s%s",&a,&b);
for(int i=0; i<m; i++)
{
insert(b+i);
// cout<<b+i<<endl;
} int ans = 0;
for(int i=0; i<n; i++)
{
ans+=query(a+i);
}
cout<<ans;
return 0;
}