令人愉快的单词(dobra)
时间限制: 0.1 秒
空间限制: 32 MB
【问题描述】
Lea 在她的一生中碰到过很多单词。其中的很大一部分都使她不愉快。作为
补偿,她开始创造一些愉快的单词。 Lea 通过写下一些看起来很不错的字母在一
张纸上来创造新单词。接下来,她擦掉一些看起来最令人讨厌的字母,并用‘_‘
来代替它们。接下来,她想要用更令人接受的字母替换掉这些下划线来构成一个
令人愉快的单词。
Lea 认为一个单词是愉快的当且仅当这个单词不包括 3 个连续的元音,不包
括 3 个连续的辅音并且包括至少一个‘L‘。
在克罗地亚文中,属于元音的字母只有 A, E, I, O, U。其它的都是辅音。
【输入文件】
输入文件 dobra.in 只有 1 行,为一个不超过 100 个字符的字符串。这个字符
串只包括大写的英文字母和‘_‘。数据保证输入中的‘_‘不超过 10 个。
【输出文件】
输出文件 dobra.out 包括一个整数,表示通过替换输入中的下划线可以构成
多少个令人愉快的单词。
注意:请使用 64 位整数类型。对于 C/C++语言,请使用 long long,对于 Pascal
语言,请使用 int64。
【输入输出样例】
input
L_V
input
V__K
input
JA_BU_K_A
output
5
output
10
output
485
三维数组DP,第一维指枚举到了那位,第二维中
下标0指连续有一个辅音并没有出现过三元或三辅的情况数
下标1指连续有两个辅音并没有出现过三元或三辅的情况数
下标2指连续有一个元音并没有出现过三元或三辅的情况数
下标4指连续有两个元音并没有出现过三元或三辅的情况数
第三维中指是否出现过‘L’。
看起来复杂其实思路很简单
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 char s[110]; 6 long long dp[110][7][2]; 7 bool ISyuan(char c) 8 {return c==‘A‘||c==‘E‘||c==‘I‘||c==‘O‘||c==‘U‘;} 9 10 int main() 11 { 12 freopen("dobra.in","r",stdin); 13 freopen("dobra.out","w",stdout); 14 scanf("%s",s+1); 15 s[0]=‘1‘; 16 int len=strlen(s)-1,tot=0; 17 for(int i=1;i<=len;i++) 18 { 19 if(s[i]==‘_‘){ 20 tot++; 21 } 22 else{ 23 if(s[i-1]<=‘Z‘&&s[i-1]>=‘A‘) 24 if(s[i+1]<=‘Z‘&&s[i+1]>=‘A‘) 25 if(ISyuan(s[i-1])==ISyuan(s[i])&&ISyuan(s[i])==ISyuan(s[i+1])){ 26 printf("0\n"); 27 return 0; 28 } 29 } 30 } 31 long long total=1; 32 for(;tot--;)total*=26ll; 33 34 if(ISyuan(s[1])){ 35 dp[1][2][0]=1ll; 36 } 37 else{ 38 if(s[1]==‘L‘) 39 dp[1][0][1]=1ll; 40 else if(s[1]!=‘_‘) 41 dp[1][0][0]=1ll; 42 else{ 43 dp[1][0][0]=20; 44 dp[1][0][1]=1; 45 dp[1][2][0]=5; 46 } 47 } 48 49 for(int i=2;i<=len;i++) 50 { 51 if(s[i]==‘_‘){ 52 dp[i][4][0]=dp[i-1][4][0]*25ll; 53 dp[i][4][1]=dp[i-1][4][0]+dp[i-1][4][1]*26ll; 54 55 dp[i][4][0]+=dp[i-1][1][0]*20ll; 56 dp[i][4][1]+=dp[i-1][1][1]*21ll+dp[i-1][1][0]; 57 dp[i][4][0]+=dp[i-1][3][0]*5ll; 58 dp[i][4][1]+=dp[i-1][3][1]*5ll; 59 60 dp[i][0][0]=dp[i-1][2][0]*20ll+dp[i-1][3][0]*20ll; 61 dp[i][0][1]=(dp[i-1][2][1]+dp[i-1][3][1])*21ll+dp[i-1][2][0]+dp[i-1][3][0]; 62 63 dp[i][1][0]=dp[i-1][0][0]*20ll; 64 dp[i][1][1]=dp[i-1][0][1]*21ll+dp[i-1][0][0]; 65 66 dp[i][2][0]=dp[i-1][0][0]*5ll+dp[i-1][1][0]*5ll; 67 dp[i][2][1]=dp[i-1][0][1]*5ll+dp[i-1][1][1]*5ll; 68 69 dp[i][3][0]=dp[i-1][2][0]*5ll; 70 dp[i][3][1]=dp[i-1][2][1]*5ll; 71 } 72 73 else{ 74 if(ISyuan(s[i])){ 75 dp[i][0][0]=dp[i][0][1]=dp[i][1][0]=dp[i][1][1]=0ll; 76 77 dp[i][2][0]=dp[i-1][0][0]+dp[i-1][1][0]; 78 dp[i][2][1]=dp[i-1][0][1]+dp[i-1][1][1]; 79 80 dp[i][3][0]=dp[i-1][2][0]; 81 dp[i][3][1]=dp[i-1][2][1]; 82 83 dp[i][4][0]=dp[i-1][4][0]+dp[i-1][3][0]; 84 dp[i][4][1]=dp[i-1][4][1]+dp[i-1][3][1]; 85 } 86 else{ 87 dp[i][2][0]=dp[i][2][1]=dp[i][3][0]=dp[i][3][1]=0ll; 88 if(s[i]==‘L‘){ 89 dp[i][0][0]=dp[i][1][0]=dp[i][2][0]=dp[i][3][0]=dp[i][4][0]=0ll; 90 91 dp[i][0][1]=dp[i-1][2][0]+dp[i-1][2][1]+dp[i-1][3][0]+dp[i-1][3][1]; 92 dp[i][1][1]=dp[i-1][0][0]+dp[i-1][0][1]; 93 94 dp[i][4][1]=dp[i-1][4][0]+dp[i-1][4][1]; 95 dp[i][4][1]+=dp[i-1][1][0]+dp[i-1][1][1]; 96 } 97 else{ 98 dp[i][4][0]=dp[i-1][4][0]+dp[i-1][1][0]; 99 dp[i][4][1]=dp[i-1][4][1]+dp[i-1][1][1]; 100 101 dp[i][0][0]=dp[i-1][2][0]+dp[i-1][3][0]; 102 dp[i][0][1]=dp[i-1][2][1]+dp[i-1][3][1]; 103 104 dp[i][1][0]=dp[i-1][0][0]; 105 dp[i][1][1]=dp[i-1][0][1]; 106 } 107 } 108 } 109 } 110 long long off=dp[len][4][0]+dp[len][4][1]+dp[len][0][0]+dp[len][1][0]+dp[len][2][0]+dp[len][3][0]; 111 printf("%lld\n",total-off); 112 return 0; 113 }
时间: 2024-11-04 21:18:09