erewrwerwer
erewrwerwer
时间限制: 1 Sec 内存限制: 512 MB题目描述
给你一个字符串,请问其有多少个子序列为erewrwerwer
输入格式:
一行一个字符串,由小写字母’e’、’w’或者’r’组成
输出格式:
一行一个整数,表示为erewrwerwer的子序列数,模1e9+7
样例输入:
erewrwerwererewrwerwer
样例输出:
260
数据范围与约定:
设n为字符串长度
对于前%20的数据,n<=11
对于另外%30的数据,n<=20
对于%100的数据,n<=100000
solution:
极其水的一个题,明显dp(然而考试上来打了个暴搜),f[i][j]表示表示到字符串中第i个位置匹配子串到第j个位置的方案数,位于特定位置上的可以往下转移就转移,答案为f[n][11]。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 #define mod 1000000007 7 int ans,len; 8 char s[100005]; 9 long long f[100005][12]; 10 int main() { 11 scanf("%s",s+1); 12 len=strlen(s+1); 13 for(int i=1; i<=len; ++i) { 14 for(int j=1; j<=11; ++j) { 15 f[i][j]=f[i-1][j]; 16 } 17 if(s[i]=='e') { 18 f[i][1]=(1+f[i-1][1])%mod; 19 f[i][3]=(f[i][3]+f[i-1][2])%mod; 20 f[i][7]=(f[i][7]+f[i-1][6])%mod; 21 f[i][10]=(f[i][10]+f[i-1][9])%mod; 22 } 23 if(s[i]=='r') { 24 f[i][2]=(f[i][2]+f[i-1][1])%mod; 25 f[i][5]=(f[i][5]+f[i-1][4])%mod; 26 f[i][8]=(f[i][8]+f[i-1][7])%mod; 27 f[i][11]=(f[i][11]+f[i-1][10])%mod; 28 } 29 if(s[i]=='w') { 30 f[i][4]=(f[i][4]+f[i-1][3])%mod; 31 f[i][6]=(f[i][6]+f[i-1][5])%mod; 32 f[i][9]=(f[i][9]+f[i-1][8])%mod; 33 } 34 } 35 cout<<(f[len][11]%mod); 36 fclose(stdin); 37 fclose(stdout); 38 return 0; 39 }