参看小白月赛3的B题,只不过这里的字符串变长了一些,注意iloveyou作为子序列出现不一定是连续的。用f[i]表示iloveyou匹配了前i个的字符的子序列数,当遇到第i个字符,则之前匹配了前i-1个的字符的子序列都可以变为匹配了前i个的字符的子序列,即f[i]=f[i]+f[i-1]。
#include<cstdio> using namespace std; char c,str[8]= {'i','l','o','v','e','y','o','u'}; const int p=20010905; int f[8]; int main() { f[0]=1; while(~scanf("%c",&c)) {//到读不到字符为止 for (int i=0;i<8;i++) if (c==str[i] || c==str[i]-32)//小写或大写都行 f[i+1]=(f[i+1]+f[i])%p; } printf("%d",f[8]);//iloveyou的数目 }