AT_tenka1_2014_final_e 田端でバタバタ

Description

[problemUrl]: https://atcoder.jp/contests/tenka1-2014-final/tasks/tenka1_2014_final_e 繰り返し文字列とは、ある空でない文字列 $ A $ があって $ A+A $ の形で表される文字列のことを表します。言語学では畳語ともいいます。日本語は畳語が非常に多く、通常の文章でも頻繁に出現します。今回はこれを数えてみたいと思います。 小文字アルファベットからなる文字列 $ S $ と $ Q $ 個のクエリ $ [a_i,b_i] $ が与えられます。$ S[a_i,b_i] $ の全ての空でない部分文字列のうち、繰り返し文字列となっているものの長さの和を求めてください。同じ文字列が複数存在する場合も、それぞれ別の物として考えてください。 なお、文字列 $ A $ と $ B $ に対して、連結したものを $ A+B $ と表します。また $ S[x,y] $ とは、文字列 $ S $ の $ x $ 文字目から $ y $ 文字目までを切り取った部分文字列を表します。

Input Format

入力は以下の形式で標準入力から与えられる。 > $ S $ $ Q $ $ a_1 $ $ b_1 $ ... $ a_Q $ $ b_Q $ - $ 1 $ 行目には、文字列 $ S\ (1\ ≦\ |S|\ ≦\ 100000) $ が与えられる。($ |S| $ は文字列 $ S $ の長さを表す) - $ 2 $ 行目には、クエリの数を表す整数 $ Q\ (1\ ≦\ Q\ ≦\ 100000) $ が与えられる。 - $ 3 $ 行目から $ Q $ 行は、クエリの情報が与えられる。 このうち $ i\ (1\ ≦\ i\ ≦\ Q) $ 行目には、 $ i $ 番目のクエリの情報を表す整数 $ a_i,\ b_i\ (1\ ≦\ a_i\ ≦\ b_i\ ≦\ |S|) $ が、スペース区切りで与えられる。

Output Format

各クエリに対する答えを、 $ 1 $ 行ずつ $ Q $ 行で出力せよ。出力の末尾には改行をいれること。

Explanation/Hint

### 部分点 $ 1\ ≦\ |S|\ ≦\ 1000 $ のテストケースに全て正解した場合 、部分点として $ 100 $ 点が与えられる。 $ 1\ ≦\ |S|\ ≦\ 20000 $ のテストケースに全て正解した場合 、部分点としてさらに $ 100 $ 点が与えられる。 全てのテストケースに正解すると、さらに $ 150 $ 点が与えられる。 ### Sample Explanation 1 `koko`と`pyonpyon`が繰り返し文字列に相当します。 $ 1 $ つ目のクエリでは、`kokoropyonpyon`について考えます。`koko`、`pyonpyon`の $ 2 $つの繰り返し文字列が存在するので、答えは $ 12 $ です。 $ 2 $ つ目のクエリでは、`okoropyonpyon`について考えます。`pyonpyon`が存在するので、答えは $ 8 $ です。 $ 3 $ つ目のクエリでは、`kokoropyonpyo`について考えます。`koko`が存在するので、答えは $ 4 $ です。 ### Sample Explanation 2 `attatt`, `ttatta`, `tt`, `tt`が、繰り返し文字列に該当します。`tt` $ 2 $ 個は別物とします。 ### Sample Explanation 3 大量の繰り返し文字列が発生するケースが存在することに注意してください。