题目:传送门
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
char a[100005], b[100005];
int aa, bb, c;
int vis[30][30] = {0};
vector<int> q[30];
for(int i=0; i<30; i++)
q[i].clear();
scanf("%d%d%d ", &aa, &bb, &c);
scanf("%s %s", a, b);
int tot = 0;
for (int i = 0; i < aa; i ++)
{
//cout<<i+c-1<<endl;
if (i + c - 1 >= aa)
break;
if (!vis[a[i] - 'a'][a[i + c - 1] - 'a'])
{
vis[a[i] - 'a'][a[i + c - 1] - 'a'] = 1;
q[a[i] - 'a'].push_back(a[i + c - 1] - 'a');
//动态数组q记录以i为开头j为结尾的,长度为k的那段
}
}
int num[30]={0};
for (int i = 0; i < bb; i++)
{
int ttt = b[i] - 'a';
num[ttt]++;
//记录出现的次数
}
long long ans = 0;
for (int i = 0; i < bb; i++)
{
int ttt = b[i] - 'a';
int tot=q[ttt].size();
// cout<<ttt<<" "<<tot<<endl;
for (int j = 0; j < tot; j++)
{
ans += num[q[ttt][j]];
//cout<<num[q[ttt][j]]<<endl;
}
num[ttt]--;//前面已经出现过的就删掉一次去
}
printf("%lld\n", ans);
}
return 0;
}