A:Concerts
题意:给出一个串T, 一个串S,求串S中有多少个串T,可以重复,但是两个字符间的距离要满足给出的数据要求
思路:先顺序统计第一个T中的字符在S中有多少个,然后对于第二位的以及后面的,我们从后面往前推,前缀和搞一搞,注意间距
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 #define N 100010 6 7 typedef long long ll; 8 9 const int MOD = 1e9 + 7; 10 11 ll sum[N]; 12 13 char strN[N], strK[N]; 14 15 int n,k; 16 int pos[100]; 17 18 int main() 19 { 20 while(~scanf("%d %d",&k,&n)) 21 { 22 memset(sum, 0, sizeof sum); 23 for(int i = 0; i < 26; ++i) 24 { 25 scanf("%d",&pos[i]); 26 } 27 scanf("%s",strK + 1); 28 scanf("%s",strN + 1); 29 for(int i = 1;i <= n; ++i) 30 { 31 sum[i] = (strN[i] == strK[1]) + sum[i - 1]; 32 sum[i] %= MOD; 33 } 34 for(int i = 2; i <= k; ++i) 35 { 36 for(int j = n; j >= 1; --j) 37 { 38 if(strN[j] == strK[i]) 39 { 40 int idx = strK[i - 1] - 'A'; 41 idx = pos[idx]; 42 if(j - idx - 1 < 1) sum[j] = 0; 43 else sum[j] = sum[j - idx - 1]; 44 } 45 else sum[j] = 0; 46 } 47 for(int j = 1;j <= n; ++j) 48 { 49 sum[j] += sum[j - 1]; 50 sum[j] %= MOD; 51 } 52 } 53 printf("%lld\n",sum[n]); 54 } 55 return 0; 56 }