P4173 残缺的字符串

    • 628通过
    • 2.6K提交
  • 题目提供者 Imagine
  • 评测方式 云端评测
  • 标签 KMP 字符串 快速傅里叶变换,DFT,FFT 数论,数学
  • 难度 省选/NOI-
  • 时空限制 1000ms / 128MB

题解

  • 提示:收藏到任务计划后,可在首页查看。
  • 体验新版界面

    最新讨论 显示

    推荐的相关题目 显示

    题目描述

    很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串$A$和$B$,其中$A$串长度为$m$,$B$串长度为$n$。可当你现在再次碰到这两个串时,这两个串已经老化了,每个串都有不同程度的残缺。

    你想对这两个串重新进行匹配,其中$A$为模板串,那么现在问题来了,请回答,对于$B$的每一个位置$i$,从这个位置开始连续$m$个字符形成的子串是否可能与$A$串完全匹配?

    输入输出格式

    输入格式:

    第一行包含两个正整数$m$,$n$,分别表示$A$串和$B$串的长度。

    第二行为一个长度为$m$的字符串$A$。

    第三行为一个长度为$n$的字符串$B$。

    两个串均仅由小写字母和*号组成,其中*号表示相应位置已经残缺。

    输出格式:

    第一行包含一个整数$k$,表示$B$串中可以完全匹配$A$串的位置个数。

    若$k > 0$,则第二行输出$k$个正整数,从小到大依次输出每个可以匹配的开头位置(下标从$1$开始)。

    输入输出样例

    输入样例#1: 复制
    3 7
    a*b
    aebr*ob
    输出样例#1: 复制
    2
    1 5

    说明

    $100$%的数据满足$1 \leq m \leq n \leq 300000$。

    提示
    标程仅供做题后或实在无思路时参考。
    请自觉、自律地使用该功能并请对自己的学习负责。
    如果发现恶意抄袭标程,将按照I类违反进行处理。