开一个数组存放iloveyou的各位字符,开一个res[]数组,表示此时连接到这个字母的数有多少个,比如:res[2]=10,那么就表示此时为il的序列有10个。如果遇到了其中字符之一,假设为第j个,那么就把res[j]加上res[j-1],因为res[j-1]的值是按照iloveyou的顺序排的序列数,并且j的顺序在j-1之后,所以直接加上就行了。最后结果就都存在res[8]中。

用一个例子来模拟:

假设有一个字符串 abcbbccab

过程: a: 1 b:1

a:1 b:2

a:1 b:3

a:2 b:5

ab的总数:5

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N=20010905;

char a[9]={'1','i','l','o','v','e','y','o','u'};
int res[9];
int main() {
    string s;
    cin>>s;
    res[0]=1;//用来初始化第一个字母的数量
    for(int i=0;i<s.size();i++)
    {
    	if(s[i]>='A' && s[i]<='Z') s[i]=s[i]-'A'+'a';
    	for(int j=1;j<9;j++)
    	{
    		if(s[i]==a[j]) 
            {
                res[j]=(res[j]+res[j-1])%N;
                if(s[i]=='i') cout<<i<<" ";
            }
            
		}
	}
    cout<<endl;
    for(int i=0;i<9;i++) cout<<res[i]<<" ";
    cout<<endl;
    cout<<res[8]<<endl;
    
	return 0;
}