对每个子串进行双hash,去重(排序)统计个数。
#include<bits/stdc++.h>
using namespace std;
int ha[2][210][210][2];
char q[1010],w[210];
int l,m,n;
int main(){
scanf("%d%d%d",&n,&m,&l);
scanf("%s",q+1);
scanf("%s",w+1);
ha[0][0][0][0]=ha[1][0][0][0]=1;
for(int z=1;z<=n;z++){
for(int y=1;y<=m;y++)
for(int x=1;x<=l;x++){
ha[z&1][y][x][0]=ha[z&1^1][y][x][0];
if (q[z]==w[y]){
ha[z&1][y][x][1]=(ha[z&1^1][y-1][x][1]+ha[z&1^1][y-1][x-1][0])%1000000007;
ha[z&1][y][x][0]=(ha[z&1][y][x][0]+ha[z&1][y][x][1])%1000000007;
}
}
for(int y=1;y<=m;y++)
for(int x=1;x<=l;x++)
ha[z&1^1][y][x][0]=ha[z&1^1][y][x][1]=0;
}
printf("%d\n",ha[n&1][m][l][0]);
}```