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: Runtime Error)

package main

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

func nStr(sc *bufio.Scanner) string {
	sc.Scan()
	return sc.Text()
}

func nInt(sc *bufio.Scanner) int {
	sc.Scan()
	i, _ := strconv.Atoi(sc.Text())
	return i
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

var r []int

func main() {
	var sc = bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)

	s := nStr(sc)
	t := nStr(sc)
	l := len(s)
	a := make([][]int, l)
	for i := 0; i < l; i++ {
		a[i] = make([]int, 26)
		for j := 0; j < 26; j++ {
			a[i][j] = -1
		}
	}
	c := make([]int, 26)
	for i := 0; i < 26; i++ {
		c[i] = -1
	}
	for tt := 0; tt < 2; tt++ {
		for i := l - 1; i >= 0; i-- {
			for j := 0; j < 26; j++ {
				a[i][j] = c[j]
			}
			k := int(s[i] - 'a')
			c[k] = i
		}
	}
	u := l - 1
	r := -1
	tl := len(t)
	for i := 0; i < tl; i++ {
		k := int(t[i] - 'a')
		n := a[u][k]
		if n < 0 {
			fmt.Println(-1)
			return
		}
		if n <= u {
			r++
		}
		u = n
	}
	fmt.Println(int64(r)*int64(l) + int64(u) + 1)
}