時間制限 : sec, メモリ制限 : KB
English / Japanese  

G: 検閲により置換 (Censored String)

物語

 梅書房にて出版されている、空前絶後の大人気を博する漫画 「空色☆ボーイズアップ」 の編集者、矢野 ――― 彼は毎日のように作家との対応に追われている。ただでさえ忙しいというのに、近々同作品のコミックアンソロジーが発売されることもあり、多くの作家と連絡を取り合わなければならず、今日もてんやわんやである。

 原稿の締め切りはもう明日までと迫ってきていた。編集者にとっては生きた心地がしない期間と言っても過言ではない。それもそのはず、この期に及んで何の連絡もなく原稿をよこさない不届き者がいるのだ。・・・しかし愚痴をこぼしていてもしかたがない、作家とのやりとりならばよくあることだ、と、感情を押し殺しながら、今日も催促の連絡を入れるのだ。そうしてメールを送信しようとした、その時だった。

 なんと、期限ぎりぎりの今になって原稿が届いているではないか!しかも、あの遅刻常習犯のボプ子先生が??起こっていることが信じられず、怪訝そうにメールフォルダを見つめる矢野は、さっそく添付されている原稿を確認し、その冒頭を読んですべてを察した。

 ・・・これは、またしても只者ではないものが来た、と。

 ボプ子先生は過激な表現で世間を震わせる、現代でも異色と言える作家である。たいていの原稿はそのままでは載せられないので、伏せるべき表現は伏せ、かつできるだけ元の表現を変えずに編集する必要があるのだ。もう時間も遅いが、これだけは終わらせて帰りたいところだ。

問題

文字列 S と、 N 個の文字列 p_1, p_2, ..., p_N からなる文字列の集合 P が与えられる。文字列 S に対して、次の操作を考える。

  • 文字列 S 中のどれか 1 文字を ‘*’ に変える

S 中の i 文字目の文字を s_i とする。S 中の任意の連続した部分文字列 S_{ij} = s_i s_{i+1} ... s_jP 中の任意の要素 p_k の組に対して、S_{ij} \neq p_k を満たすようにするための最小の操作回数を求めよ。

入力形式

入力は以下の形式で与えられる。

S
N
p_1
p_2
$\vdots$
p_N
  • 1 行目では、文字列 S が与えられる。
  • 2 行目では、集合 P に属する文字列の個数 N が与えられる。
  • 3 行目以降の N 行では、 集合 P に属する i 番目の文字列 p_i が与えられる。

制約

  • 1 \leq |S| \leq 10^5
  • 1 \leq N \leq 10^5
  • 1 \leq |p_1| + |p_2| + ... + |p_N| \leq 10^5
  • i \neq j ならば、 p_i \neq p_j
  • S および p_i は英小文字のみからなる文字列

出力形式

操作回数の最小値を 1 行で出力せよ。末尾の改行を忘れないこと。

入力例1

brainfuck
1
fuck

出力例1

1

例えば、 “brainf*ck” とすることで条件を満たします。

入力例2

aaa
1
a

出力例2

3

検閲はとても厳しいです。

入力例3

hellshakeyano
3
hell
shake
key

出力例3

2

この場合は、例えば “h*llsha*eyano” とすることで条件を満たします。 1 つの文字を ‘*’ に変えることによって、集合 P に属する複数の文字列が同時に S の部分文字列として現れなくなることもあります。

Note

Link