Problem:
Score : 500 points

Problem Statement

Given are two strings s and t consisting of lowercase English letters. Determine if there exists an integer i satisfying the following condition, and find the minimum such i if it exists.

Let s' be the concatenation of 10^{100} copies of s. t is a subsequence of the string {s'}_1{s'}_2\ldots{s'}_i (the first i characters in s').

Notes

A subsequence of a string a is a string obtained by deleting zero or more characters from a and concatenating the remaining characters without changing the relative order. For example, the subsequences of contest include net, c, and contest.

Constraints

1 \leq |s| \leq 10^5

1 \leq |t| \leq 10^5

s and t consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

s
t

Output

If there exists an integer i satisfying the following condition, print the minimum such i; otherwise, print -1.

Sample Input 1

contest
son

Sample Output 1

10

t = son is a subsequence of the string contestcon (the first 10 characters in s' = contestcontestcontest...), so i = 10 satisfies the condition.

On the other hand, t is not a subsequence of the string contestco (the first 9 characters in s'), so i = 9 does not satisfy the condition.

Similarly, any integer less than 9 does not satisfy the condition, either. Thus, the minimum integer i satisfying the condition is 10.

Sample Input 2

contest
programming

Sample Output 2

-1

t = programming is not a substring of s' = contestcontestcontest.... Thus, there is no integer i satisfying the condition.

Sample Input 3

contest
sentence

Sample Output 3

33

Note that the answer may not fit into a 32-bit integer type, though we cannot put such a case here.

Solution in JavaScript (node.js v5.12) (judge verdict: Accepted)

const main = (input) => {
  var s = input[0];
  var t = input[1];

  var smap = {};
  for(var i=0;i<s.length;i++){
    var w = s[i];
    if(!smap[w])smap[w]=[];
    smap[w].push(i+1);
  }
  var ans = 0;
  var now = 0;
  for(var i=0;i<t.length;i++){
    var w = t[i];
    if(!smap[w] || smap[w].length == 0){ans = -1; break;}
    var idx = bsearch(smap[w], now+1);
    if(idx==-1){
      ans+=s.length;
      if(i==t.length-1){
        ans += smap[w][0];
      }else{
        now = smap[w][0];
      }
    }else{
      if(i==t.length-1){
        ans += smap[w][idx];
      }else{
        now = smap[w][idx];
      }
    }
  }
  console.log(ans);
}

function bsearch(arr, n){
  var a = 0;
  var b = arr.length-1;
  var ans = -1;
  while(a<=b){
    var ave = ~~((a+b)/2);
    if(arr[ave]<n){
      a = ave+1;
    }else{
      ans = Math.min(ans==-1?ave:ans,ave);
      b = ave-1;
    }
  }
  return ans;
}

main(require('fs').readFileSync('/dev/stdin', 'UTF-8').trim().split("\n"));