A - Arranging tiles
留坑。
B - Buggy ICPC
题意:给出一个字符串,然后有两条规则,如果打出一个辅音字母,直接接在原字符串后面,如果打出一个元音字母,那么接在原来的字符串后面之后再翻转整个字符串,在这两条规则之下,求有多少种打印给定字符串的方法
思路:如果第一个字符是辅音,那么答案为0
如果全是辅音或全是元音,那么答案为1
如果只有一个辅音,答案为len
否则是最中间两个元音中间的辅音字符个数+1
1 #include <bits/stdc++.h> 2 3 using namespace std; 4 5 #define N 100010 6 7 char s[N]; 8 9 bool vis[210]; 10 11 inline void Init() 12 { 13 vis['a'] = 1; 14 vis['e'] = 1; 15 vis['i'] = 1; 16 vis['o'] = 1; 17 vis['u'] = 1; 18 } 19 20 inline int work() 21 { 22 int len = strlen(s); 23 if (len == 1) return 1; 24 int cnt = 0; 25 for (int i = 0; i < len; ++i) if (vis[s[i]]) cnt++; 26 if (cnt == 0 || cnt == len) return 1; 27 if (!vis[s[0]]) return 0; 28 if (cnt == 1) return len; 29 int l = 0, r = len - 1; 30 while (vis[s[r]] == 0) --r; 31 int flag = 0; 32 for (; true; flag ^= 1) 33 { 34 cnt = 0; 35 if (flag == 0) 36 { 37 ++l; 38 while (true) 39 { 40 if (l == r) return cnt + 1; 41 if (vis[s[l]]) break; 42 ++cnt;++l; 43 } 44 } 45 else 46 { 47 --r; 48 while (true) 49 { 50 if (l == r) return cnt + 1; 51 if (vis[s[r]]) break; 52 ++cnt;--r; 53 } 54 } 55 } 56 } 57 58 int main() 59 { 60 Init(); 61 while (scanf("%s", s) != EOF) 62 { 63 printf("%d\n", work()); 64 } 65 return 0; 66 }