题目链接。
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <string> using namespace std; const int maxn = 1000+10; char s1[maxn], s2[maxn], s3[maxn]; int dp1[maxn][maxn], dp2[maxn][maxn]; int que1[maxn][2], que2[maxn][2]; void max_dp(char *s1, char *s2, int (*dp)[maxn]) { int len1 = strlen(s1), len2 = strlen(s2); for(int i=0; i<len1; i++) dp[i][0] = 0; for(int i=0; i<len2; i++) dp[0][i] = 0; for(int i=1; i<=len1; i++) { for(int j=0; j<=len2; j++) { if(s1[i-1] == s2[j-1]) dp[i][j] = dp[i-1][j-1]+1; else dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } } } void str_rev(char *s) { int len = strlen(s); for(int i=0; i<len/2; i++) swap(s[i], s[len-1-i]); } int get_str(char *s1, char *s2, int (*que)[2]) { int len1 = strlen(s1), len2 = strlen(s2); int n = 0; for(int i=0; i<len1; i++) { if(s1[i] == s2[0]) { int k = 1, j; for(j=i+1; j<len1; j++) { if(s1[j] == s2[k]) k++; if(k == len2) break; } if(k == len2) { que[n][0] = i; que[n++][1] = j; } } } return n; } int main() { int T; scanf("%d", &T); for(int kase=1; kase<=T; kase++) { scanf("%s %s %s", s1, s2, s3); int len1 = strlen(s1); int len2 = strlen(s2); int len3 = strlen(s3); int n1 = get_str(s1, s3, que1); int n2 = get_str(s2, s3, que2); max_dp(s1, s2, dp1); str_rev(s1); str_rev(s2); max_dp(s1, s2, dp2); int ans = 0; for(int i=0; i<n1; i++) { for(int j=0; j<n2; j++) { ans = max(ans, dp1[que1[i][0]][que2[j][0]]+dp2[len1-que1[i][1]-1][len2-que2[j][1]-1]+len3); } } printf("Case #%d: ", kase); printf("%d ", ans); } return 0; }