Problem:
不運なイクタ君は持っていた大事な文字列Tをウィルスによって異なる文字列T'に書き換えられてしまった。そのウィルスがTの１文字を異なる文字に書き換えてしまったことがわかっている。すなわちTとT'はちょうど１文字のみ異なっている。イクタ君はTを復元するために、Tが出現していると思われる文書Sを用意した。Tを復元するための下準備としてSの部分文字列でTと一致している可能性があるものの個数を調べたい。

文字列T'と文書Sが与えられる。
S = a1 a2 a3 . . . a|S|の長さ|T'|の部分文字列ak ak+1 . . . ak+|T'|−1(1 ≤ k ≤ |S| − |T'| + 1)
でT'と比較して1文字だけ異なるものの数を求めよ。

Input

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

S
T'

１行目でSが与えられる。

２行目でT'が与えられる。

S, T'はそれぞれ大文字、小文字のアルファベットのみからなる。

Constraints

入力中の各変数は以下の制約を満たす。

1 ≤ |S| ≤ 300,000

1 ≤ |T'| ≤ |S|

Output

条件を満たす部分文字列の数を1行に出力せよ。

Sample Input 1

abcbcdbc
abc

Output for the Sample Input 1

2

Sの3番目の文字から始まるcbc, Sの6番目の文字から始まるdbcが条件を満たす。

Sample Input 2

aaaaaa
aaaaaa

Output for the Sample Input 2

0

完全に一致する文字列は数えてはならない。

Sample Input 3

baaaaaaaa
b

Output for the Sample Input 3

8

Solution in C++ (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;

typedef unsigned long long ulli;
const int MAXN = 300005;
const ulli B = 1000000007ULL;
ulli Bn[MAXN];

int main() {
  Bn[0] = 1;
  for(int i = 1; i < MAXN; ++i) Bn[i] = Bn[i-1] * B;
  for(string S, T; cin >> S >> T; ) {
    map<ulli, ulli> num;
    ulli hash = 0;
    for(int i = 0; i < S.size(); ++i) {
      hash = hash * B + S[i];
      if(i >= T.size()) hash -= S[i-T.size()] * Bn[T.size()];
      if(i+1 >= T.size()) num[hash]++;
    }
    hash = 0;
    for(int i = 0; i < T.size(); ++i) {
      hash = hash * B + T[i];
    }
    ulli res = 0;
    for(int i = 0; i < T.size(); ++i) {
      for(char c = 'A'; c <= 'z'; ++c) {
        if(!isalpha(c)) continue;
        if(c == T[i]) continue;
        if(num.count(hash + (c - T[i]) * Bn[T.size()-i-1])) {
          res += num[hash + (c - T[i]) * Bn[T.size()-i-1]];
        }
      }
    }
    cout << res << endl;
  }
  return 0;  
}