L3-2 至多删三个字符 (30 分)
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<string> #include<map> #include<queue> #include<vector> using namespace std; #define ll long long int #define INF 0x3f3f3f3f #define Irish_Moonshine main const int maxn = 1e6 + 10; char str[maxn]; ll dp[maxn][4]; int Irish_Moonshine() { scanf("%s", str); int len = strlen(str); for (int i = 0; i <= len; i++) dp[i][0] = 1; dp[0][1] = 1; for (int i = 1; i < len; i++) { dp[i][1] = dp[i - 1][0] + dp[i - 1][1]; if (str[i] == str[i - 1]) dp[i][1]--; } dp[1][2] = 1; for (int i = 2; i < len; i++) { dp[i][2] = dp[i - 1][1] + dp[i - 1][2]; if (str[i] == str[i - 1]) dp[i][2] -= dp[i - 2][1]; else if (str[i] == str[i - 2]) dp[i][2]--; } dp[2][3] = 1; for (int i = 3; i < len; i++) { dp[i][3] = dp[i - 1][3] + dp[i - 1][2]; if (str[i] == str[i - 1]) dp[i][3] -= dp[i - 2][2]; else if (str[i] == str[i - 2]) dp[i][3] -= dp[i - 3][1]; else if (str[i] == str[i - 3]) dp[i][3]--; } ll ans = dp[len - 1][0] + dp[len - 1][1] + dp[len - 1][2] + dp[len - 1][3]; printf("%lld\n", ans); return 0; } //_CRT_SECURE_NO_WARNINGS