题目:http://acm.hdu.edu.cn/showproblem.php?pid=2577
AC代码(C++):
#include <iostream> #include <queue> #include <vector> #include <set> #include <string> #include <algorithm> #include <string.h> #include <math.h> #define INF 0x3f3f3f3f #define eps 1e-8 typedef unsigned long long ull; typedef long long ll; using namespace std; char str[110]; int main() { int t; cin >> t; while (t--) { cin >> str; bool caps = false; bool upper; int len = 0; int ans = 0; if (isupper(str[0]))upper = true; else upper = false; for (int i = 0; str[i] != '\0'; i++) { if (isupper(str[i])) { if (upper)len++; else { if (caps) { if (len == 1)ans += 2; else if (len >= 2) { ans += 1 + len; caps = false; } } else ans += len; len = 1; upper = true; } } else { if (!upper)len++; else { if (!caps) { if (len == 1)ans += 2; else if (len >= 2) { ans += 1 + len; caps = true; } } else ans += len; len = 1; upper = false; } } } if (upper&&caps)ans += len + 1; else if (upper&&!caps) { if (len == 1)ans += 2; else if (len >= 2)ans += 2 + len; } else if (!upper&&caps)ans += 1 + len; else if (!upper&&!caps)ans += len; cout << ans << endl; } //system("pause"); }总结: 模拟题, 当连续两个或两个以上的大写或小写字母出现时用Caps, 否则用Shift. 注意最后要关Caps.