NC231682. 特工 007
描述
输入描述
第一行两个整数 , ( ) ,表示任务时间表长度为 , 对 种任务感到厌倦。
第二行一个字符串 长度为 ,保证出现的字符均为大写英文字母。
第三行一个字符串 长度为 ,表示 厌倦的 种任务。
输出描述
一个整数,表示 完成整张任务时间表的方案数。
示例1
输入:
5 1 ABCAB A
输出:
2
pypy3 解法, 执行用时: 616ms, 内存消耗: 140128K, 提交时间: 2021-12-19 17:27:06
def main(): n, m = map(int, input().split()) s = input().strip("\r\n") if m > 0: ws = input().strip("\r\n") else: ws = "" mod = 10 ** 9 + 7 f = [[0] * 2 for _ in range(n)] f[0][1] = 1 for i in range(1, n): if s[i] in ws: f[i][0] = f[i - 1][1] f[i][1] = (f[i - 1][0] + f[i - 1][1]) % mod ans = (f[n - 1][0] + f[n - 1][1]) % mod print(ans) main()
C++ 解法, 执行用时: 46ms, 内存消耗: 9348K, 提交时间: 2021-12-22 12:02:40
#include<bits/stdc++.h> using namespace std; #define int long long int n,m; string s1,s2; int dp[1000005]; bool pd[200]; int mod=1e9+7; signed main(){ cin>>n>>m; cin>>s1>>s2; for(int i=0;i<m;i++){ pd[s2[i]]=1; } dp[0]=1; for(int i=0;i<n-1;i++){ if(pd[s1[i+1]]){ dp[i+2]+=dp[i]; dp[i+2]%=mod; } dp[i+1]+=dp[i]; dp[i+1]%=mod; } printf("%lld",(dp[n]+dp[n-1])%mod); return 0; }
Python3 解法, 执行用时: 1722ms, 内存消耗: 126464K, 提交时间: 2022-04-08 14:46:09
n,m=map(int,input().split()) s=input() if m >0:ws=input() else:ws="" f=[[0]*2 for _ in range(n)] mod,f[0][1]=10**9+7,1 for i in range(1,n):#第一个不能跳过,所以不用判断,所以是1~n if s[i] in ws:f[i][0]=f[i-1][1] f[i][1]=(f[i-1][0]+f[i-1][1]) % mod print((f[n-1][0]+f[n-1][1]) % mod)