题解 | #I love you#
I love you
https://ac.nowcoder.com/acm/problem/201612
开一个数组存放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;
}