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 Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

/*
Stay innocent, be naive. 
But still dream big. 
Dream big to the point that it is beyond your ability and endeavour to achieve it. 
So dream big and don’t lose your innocence.
*/
import java.util.*;
import java.io.*;

   public class Main
   {
      public static void main(String args[]) throws Exception
      {
         BufferedReader infile = new BufferedReader(new InputStreamReader(System.in));  
         StringTokenizer st = new StringTokenizer(infile.readLine());
         String input1 = st.nextToken();
         String input2 = infile.readLine();
         char[] arr = input1.toCharArray();
         char[] arr2 = input2.toCharArray();
         int N = arr.length;
         int M = arr2.length;
         //edge
         HashSet<Character> set = new HashSet<Character>();
         for(char c: arr)
            set.add(c);
         for(char c: arr2)
            if(!set.contains(c))
            {
               System.out.println(-1);
               return;
            }
         //define
         HashMap<Character, Integer> map = new HashMap<Character, Integer>();
         int boof = 0;
         for(char c: arr)
         {
            if(!map.containsKey(c))
               map.put(c, boof++);
         }
         //bst
         TreeSet<Integer>[] bts = new TreeSet[set.size()];
         for(int i=0; i < bts.length; i++)
            bts[i] = new TreeSet<Integer>();
         for(int i=0; i < N; i++)
         {
            int dex = map.get(arr[i]);
            bts[dex].add(i);
         }
         //query
         long res = 0L;
         for(int i=0; i < M; i++)
         {
            int check = map.get(arr2[i]);
            int dex = (int)(res%N);
            if(bts[check].last() < dex)
               res += (N-dex)+bts[check].first();
            else
            {
               int next = bts[check].ceiling(dex);
               if(next != dex || i > 0 && arr2[i] != arr2[i-1] || i == 0)
                  res += next-dex;
               else
               {
                  //neighbors
                  int temp = dex+1;
                  if(bts[check].last() < temp)
                     res += (N-temp)+bts[check].first();
                  else
                     res += bts[check].ceiling(temp)-temp;
                  res++;
               }
            }
         }
         System.out.println(res+1);
      }
   }