package main import ( "bufio" "fmt" "os" "sort" "strconv" ) var pStr, sStr string var endPositions map[int]bool // dfs: 从 sIdx 和 pIdx 开始尝试匹配 func dfs(sIdx, pIdx int) { if pIdx == len(pStr) { endPositions[sIdx] = true return } if sIdx == len(sStr) { return } if pStr[pIdx] == sStr[sIdx] { dfs(sIdx+1, pIdx+1) } else if pStr[pIdx] == '*' { // 三种情况: // 1. '*' 匹配空(跳过 '*') dfs(sIdx, pIdx+1) // 2. '*' 匹配当前字符,并继续用 '*' 匹配后续 dfs(sIdx+1, pIdx) // 3. '*' 仅匹配当前字符 dfs(sIdx+1, pIdx+1) } } func main() { scanner := bufio.NewScanner(os.Stdin) scanner.Split(bufio.ScanWords) scanner.Scan() pStr = scanner.Text() scanner.Scan() sStr = scanner.Text() foundMatch := false // 存储结果:起始位置 → 长度列表 type Result struct { Start, Length int } var results []Result for i := 0; i < len(sStr); i++ { // 只有首字符匹配,或模式首字符是 '*' 才尝试匹配 if pStr[0] == '*' || pStr[0] == sStr[i] { endPositions = make(map[int]bool) // 清空上次结果 dfs(i, 0) if len(endPositions) > 0 { foundMatch = true // 收集所有有效的匹配(长度 > 0) for endPos := range endPositions { if endPos > i { results = append(results, Result{Start: i, Length: endPos - i}) } } } } } // 去重并排序:按起始位置,再按长度 uniqueResults := make(map[string]bool) var finalResults []Result for _, r := range results { key := strconv.Itoa(r.Start) + "," + strconv.Itoa(r.Length) if !uniqueResults[key] { uniqueResults[key] = true finalResults = append(finalResults, r) } } // 排序输出 sort.Slice(finalResults, func(i, j int) bool { if finalResults[i].Start == finalResults[j].Start { return finalResults[i].Length < finalResults[j].Length } return finalResults[i].Start < finalResults[j].Start }) // 输出结果 if foundMatch && len(finalResults) > 0 { for _, r := range finalResults { fmt.Printf("%d %d\n", r.Start, r.Length) } } else { fmt.Println("-1 0") } }