记录编号 616310 评测结果 AAAAAAAAAA
题目名称 [NOIP 2015]子串 最终得分 100
用户昵称 Gravatar终焉折枝 是否通过 通过
代码语言 C++ 运行时间 0.126 s
提交时间 2026-06-12 09:25:36 内存使用 3.79 MiB
显示代码纯文本
//#pragma GCC optimize(3)
//#pragma GCC target("avx")
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("inline")
//#pragma GCC optimize("-fgcse")
//#pragma GCC optimize("-fgcse-lm")
//#pragma GCC optimize("-fipa-sra")
//#pragma GCC optimize("-ftree-pre")
//#pragma GCC optimize("-ftree-vrp")
//#pragma GCC optimize("-fpeephole2")
//#pragma GCC optimize("-ffast-math")
//#pragma GCC optimize("-fsched-spec")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC optimize("-falign-jumps")
//#pragma GCC optimize("-falign-loops")
//#pragma GCC optimize("-falign-labels")
//#pragma GCC optimize("-fdevirtualize")
//#pragma GCC optimize("-fcaller-saves")
//#pragma GCC optimize("-fcrossjumping")
//#pragma GCC optimize("-fthread-jumps")
//#pragma GCC optimize("-funroll-loops")
//#pragma GCC optimize("-fwhole-program")
//#pragma GCC optimize("-freorder-blocks")
//#pragma GCC optimize("-fschedule-insns")
//#pragma GCC optimize("inline-functions")
//#pragma GCC optimize("-ftree-tail-merge")
//#pragma GCC optimize("-fschedule-insns2")
//#pragma GCC optimize("-fstrict-aliasing")
//#pragma GCC optimize("-fstrict-overflow")
//#pragma GCC optimize("-falign-functions")
//#pragma GCC optimize("-fcse-skip-blocks")
//#pragma GCC optimize("-fcse-follow-jumps")
//#pragma GCC optimize("-fsched-interblock")
//#pragma GCC optimize("-fpartial-inlining")
//#pragma GCC optimize("no-stack-protector")
//#pragma GCC optimize("-freorder-functions")
//#pragma GCC optimize("-findirect-inlining")
//#pragma GCC optimize("-fhoist-adjacent-loads")
//#pragma GCC optimize("-frerun-cse-after-loop")
//#pragma GCC optimize("inline-small-functions")
//#pragma GCC optimize("-finline-small-functions")
//#pragma GCC optimize("-ftree-switch-conversion")
//#pragma GCC optimize("-foptimize-sibling-calls")
//#pragma GCC optimize("-fexpensive-optimizations")
//#pragma GCC optimize("-funsafe-loop-optimizations")
//#pragma GCC optimize("inline-functions-called-once")
//#pragma GCC optimize("-fdelete-null-pointer-checks")
//#pragma GCC optimize(2)
#include<iostream>
#include<algorithm>
#include<set>
#include<map>
#include<unordered_map>
#include<cmath>
#include<queue>
#include<stack>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<typeinfo>
#define ll long long
#define ull usigned long long
using namespace std;
namespace M{
    template<typename T>
    inline T min(T a, T b){return a < b ? a : b;}
    template<typename T>
    inline T max(T a, T b){return a > b ? a : b;}
    template<typename T>
    inline T abs(T x){return x < 0 ? -x : x; }
    template<typename T>
    inline void swap(T &a, T &b){T x = a; a = b, b = x;}
    template<typename T>
    inline T gcd(T a, T b){return b == 0 ? a : gcd(b, a % b);}
    template<typename T>
    inline T lcm(T a, T b){return (a / gcd(a, b)) * b;}
    template<typename T>
    inline T pow(T x, T n){
        T res = 1;
        while(n){
            if(n & 1) res = res * x;
            n >>= 1; x = x * x;
        }
        return res;
    }
    template<typename T>
    inline T pow(T x, T n, const T Mode){
        T res = 1;
        while(n){
            if(n & 1) res = (res * x) % Mode;
            n >>= 1;
			x = (x * x) % Mode;
        }
        return res % Mode;
    }
}

const int N = 1e3 + 5;
const int MM = 202 + 5;
int f[MM][MM];
//f[i][j][k] 表示选择第 i 位,且选 k 个子串,匹配模式串的前 j 个字符
int g[MM][MM];
//g[i][j][k] 表示前缀的方案数,选择了 k 个字串,匹配前 j 个字符
int n, m, K;
char a[N], b[N];
const int P = 1e9 + 7;

int main(){
	cin >> n >> m >> K;
	cin >> (a + 1);
	cin >> (b + 1);
	f[0][0] = 1;
	g[0][0] = 1;
	for(int i = 1;i <= n;i ++){
		for(int j = m;j >= 1;j --){
			for(int k = K;k >= 1;k --){
				if(a[i] == b[j]){
					f[j][k] = (g[j - 1][k - 1] + f[j - 1][k]) % P;
					g[j][k] = (g[j][k] + f[j][k]) % P;
				}
				else{
					f[j][k] = 0;
					g[j][k] = g[j][k];
				}
			}
		}
	}
	cout << g[m][K] << '\n';
	return 0;
}