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 Go (1.6) (judge verdict: Wrong Answer)

package main

import (
	"bufio"
	"fmt"
	"os"
)

var sc = bufio.NewScanner(os.Stdin)

func next() string {
	sc.Scan()
	return sc.Text()
}

func lowerBound(a []int, x int) int {
	n := len(a)
	ok := n
	ng := -1
	for ok-ng > 1 {
		mid := (ok + ng) / 2
		if a[mid] >= x {
			ok = mid
		} else {
			ng = mid
		}
	}
	return ok
}

func main() {
	sc.Split(bufio.ScanWords)

	s := next()
	t := next()

	idxs := make([][]int, 256)
	for i := 0; i < len(s); i++ {
		idxs[s[i]] = append(idxs[s[i]], i)
	}

	// [0, cur)
	cur := 0
	ng := false
	for i := 0; i < len(t); i++ {
		is := idxs[t[i]]
		if is == nil || len(is) == 0 {
			ng = true
			break
		}
        nidx := lowerBound(is, cur%len(s))
		if nidx == len(is) {
			nidx = 0
		}
		ncur := (cur/len(s))*len(s) + is[nidx] + 1
		if ncur <= cur {
			ncur += len(s)
		}
		cur = ncur
	}
	if ng {
		fmt.Println(-1)
	} else {
		fmt.Println(cur)
	}
}