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++14 (judge verdict: Wrong Answer)

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

#ifdef BTK
#include<dvector.h>
#define DEBUG if(1)
#else
#define CIN_ONLY if(1)
struct cww{cww(){
    CIN_ONLY{
        ios::sync_with_stdio(false);cin.tie(0);
    }
}}star;
#define DEBUG if(0)
#endif

#define fin "\n"
#define FOR(i,bg,ed) for(int i=(bg);i<(ed);i++)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) (v).begin(),(v).end()
#define fi first
#define se second
#define pb push_back
#define REC(ret, ...) std::function<ret (__VA_ARGS__)>
template <typename T>inline bool chmin(T &l,T r)
{bool a=l>r;if(a)l=r;return a;}
template <typename T>inline bool chmax(T &l,T r)
{bool a=l<r;if(a)l=r;return a;}
template <typename T>
istream& operator>>(istream &is,vector<T> &v){
    for(auto &it:v)is>>it;
    return is;
}

namespace roll{
    using H = unsigned long long;
                     //0123456789
    constexpr H p[] = {1000000009,
                       1000000007,
                       90001};
    constexpr int MX = 1123456;
    H hs[3][MX];
    H rh[3][MX];
    template<int m = 1>
    void build(const string s){
        const int n = s.size();
        REP(i,m){
            hs[i][0] = 0;
            rh[i][0] = 1;
            REP(i,m)REP(j,n){
                hs[i][j+1] = hs[i][j]*p[i] + s[j];
                rh[i][j+1] = rh[i][j]*p[i];
            }
        }
    }
    template<int m = 1>
    H get(const int l,const int r){
        H ret = 0;
        REP(i,m){
            ret ^= hs[i][r] - hs[i][l] * rh[i][r-l];
        }
        return ret;
    }
}
typedef roll::H H;
int n,m;
int main(){
    string s,t;
    cin>>s>>t;
    n=s.size();
    m=t.size();
    roll::build(t);
    H base = roll::get(0,m);
    roll::build(s);
    LL ret=0;
    unordered_map<H,int> memo;
    REP(i,n-m+1){
        //cout<<i<<i+m<<"-"<<roll::get(i,i+m)-base<<endl;
        memo[roll::get(i,i+m)-base]++;
    }
    string u(m,'b'-'a');
    roll::build(u);
    REP(i,m){
        H diff = roll::get(0,i+1)-roll::get(0,i);
        FOR(k,-26,27)if(k!=0)if(memo.count(diff*k)){
                //cout<<i<<"-"<<k<<endl;
                ret+=memo[diff*k];
            }
    }
    cout<<ret<<endl;
    return 0;
}