package main import ( "bufio" "fmt" "os" ) func main() { for { scanner := bufio.NewScanner(os.Stdin) // 设置大缓冲区,防止大输入时出错 buf := make([]byte, 1024*1024) // 1MB scanner.Buffer(buf, 1024*1024) scanner.Split(bufio.ScanWords) // 按单词扫描(空格、换行等分隔) // 读取第一行:n scanner.Scan() str1 := scanner.Text() if len(str1) == 0 { break } scanner.Scan() str2 := scanner.Text() scanner.Scan() aim := scanner.Text() if process3(str1, str2, aim) { fmt.Println("YES") } else { fmt.Println("NO") } } } // func process(str1, str2, aim string) bool { // return subprocess(0, 0, str1, str2, aim) // } // func subprocess(i, j int, str1, str2, aim string) bool { // if len(str1)+len(str2) != len(aim) { // return false // } // if i+j == len(aim) { // return true // } // find1 := false // if i < len(str1) && str1[i] == aim[i+j] { // find1 = subprocess(i+1, j, str1, str2, aim) // } // find2 := false // if j < len(str2) && str2[j] == aim[i+j] { // find2 = subprocess(i, j+1, str1, str2, aim) // } // return find1 || find2 // } func process2(str1, str2, aim string) bool { if len(str1)+len(str2) != len(aim) { return false } dp := make([][]bool, len(str1)+1) for i := 0; i < len(dp); i++ { dp[i] = make([]bool, len(str2)+1) } dp[len(str1)][len(str2)] = true for j := len(str2) - 1; j >= 0; j-- { if str2[j] == aim[j+len(str1)] { dp[len(str1)][j] = dp[len(str1)][j+1] } } for i := len(str1) - 1; i >= 0; i-- { if str1[i] == aim[i+len(str2)] { dp[i][len(str2)] = dp[i+1][len(str2)] } } for i := len(str1) - 1; i >= 0; i-- { for j := len(str2) - 1; j >= 0; j-- { find1 := false if str1[i] == aim[i+j] { find1 = dp[i+1][j] } find2 := false if str2[j] == aim[i+j] { find2 = dp[i][j+1] } dp[i][j] = find1 || find2 } } return dp[0][0] } func process3(str1, str2, aim string) bool { if len(str1)+len(str2) != len(aim) { return false } // 原有逻辑上改进空间 dp := make([]bool, len(str2)+1) dp[len(str2)] = true for j := len(str2) - 1; j >= 0; j-- { if str2[j] == aim[j+len(str1)] { dp[j] = dp[j+1] } } for i := len(str1) - 1; i >= 0; i-- { for j := len(str2); j >= 0; j-- { if j == len(str2) { if str1[i] != aim[i+len(str2)] { dp[j] = false } } else { find1 := false if str1[i] == aim[i+j] { find1 = dp[j] } find2 := false if str2[j] == aim[i+j] { find2 = dp[j+1] } dp[j] = find1 || find2 } } } return dp[0] }