碰到这个题第二次了,第一次是在牛客上做过一次,当时没写出来,赛后看的题解补了一下,昨晚在LDU测试赛中再一次相遇,竟然忘了咋写的了,经过一番试错之后,顺利AC,在此记录一波。
B. 有几个ACM
Description
有一群人非常喜欢ACM 比赛,只要是跟ACM 相关的东西他们都非常在意。有一天,他们在鲁东大学的校园里看到了一个仅由”A”、”C”、”M”这三个字符组成的横幅。一时兴起,他们想要知道这个横幅里出现了几次”ACM”,你也是其中的一员,请编写一个程序解决这个问题。
Input
输入只有一行,包含一个字符串s(length(s)≤105 ),只含有A、C、M 这三种字母。
Output
在一行中输出给定的字符串中含有多少个ACM。最终的结果可能比较大,请对结果用1000000007 取余。
Samples
Input Copy
CAACAM
Output
2
Hint
字符串CAACAM 中包含了两个ACM,其中
第一个ACM 是字符的第2 位(A),第4 位©,第6 位(M);
第二个ACM 是字符的第3 位(A),第4 位©,第6 位(M)。
Source
2020年烟大校赛
题目大意:中文题意不过多解释。
注意:只要存在一个字母位置不同就算一种情况;
解题思路:对于目的字符串中的每一个字母都只其由前一个字母递推而来,在每次遍历给定模式串中的字母时,若出现目的串中的某个字母就需要将该字母所在位置及其后面所有位置都需要更新答案。
递推公式:
dp[i] = dp[i] + dp[i-1];
上代码:
#include<queue>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod = 1e9 + 7;
char c[] = { 'A','C','M' };
int dp[5];
int main()
{
string str;
cin >> str;
dp[0] = 1;//处理边界
for (int i = 0;i < str.size();i++)
{
for (int j = 0;j < 3;j++)
{
if (str[i] == c[j])
{
dp[j + 1] = (dp[j + 1] + dp[j]) % mod;
}
}
}
cout << dp[3] % mod << endl;
return 0;
}
需要注意的是,一开始需要让
d
p
[
0
]
=
1
dp[0] = 1
dp[0]=1;
下面也附上牛客原题地址,有兴趣的也可以AC一下子。
牛客原题:I love you