题目描述
此时相望不相闻,愿逐月华流照君。
一纸情书,到底蕴含了多少倍的爱情呢?
I love you, not only for what you are, but for what I am when I am with you.
输入描述:
共一行:一封若干个字符的情书(大小写不敏感)。
情书不会超过684594个字符(大写、小写字母)。
输出描述:
共一行:包含一个整数,即iloveyou在情书中作为子序列出现的次数。
由于答案可能很大,请输出对20010905取模后的值。
示例1
输入
IloveyouNotonlyforwhatyouareButforwhatIamWhenIamwithyouIloveyouNotonlyforwhatYouhavemadeofyourselfButforwhatYouaremakingofme
输出
2864
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int INF=0x3f3f3f3f;
const int mod=20010905;
int dp[8];
int main()
{
string str;
cin>>str;
for(int i=0;i<str.size();i++)
{
str[i]=tolower(str[i]);
if(str[i]=='i')dp[0]++;
if(str[i]=='l')dp[1]=(dp[1]+dp[0])%mod;
if(str[i]=='o')dp[2]=(dp[1]+dp[2])%mod;
if(str[i]=='v')dp[3]=(dp[3]+dp[2])%mod;
if(str[i]=='e')dp[4]=(dp[4]+dp[3])%mod;
if(str[i]=='y')dp[5]=(dp[5]+dp[4])%mod;
if(str[i]=='o')dp[6]=(dp[6]+dp[5])%mod;
if(str[i]=='u')dp[7]=(dp[7]+dp[6])%mod;
}
cout<<dp[7]<<endl;
}
思路这道题跟我前面发的CF上的一道题很相似,让求i love you这段字符串出现的次数,可以不是连续的,dp[0]算的是I的个数,dp[1]是 L的个数,实际上算的是I L出现的次数,但是为啥打dp[1]等于dp[1]加上dp[0]的个数呢,比方说前面已经出现过n次I,后面每出现一次L,也就是IL的次数就会加n。后面依次向后推,dp[7]就是整个字符串出现的次数。很巧妙!Orz。