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 C# (Mono 4.6.2.0) (judge verdict: Time Limit Exceeded)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using static Input;
using static Util;
class Program
{
    static string S;
    static string T;
    static void INPUT()
    {
        S = NextString();
        T = NextString();
    }
    static void OUTPUT()
    {
        var SS = S + S;
        var d = new List<List<int>>();
        var sl = S.Length;
        for (int i = 0; i < 26; i++)
            d.Add(new List<int>());

        for (int i = 0; i < SS.Length; i++)
            d[SS.ElementAt(i) - 'a'] .Add(i+1);

        var dic = new Dictionary<int, int[]>();
        for (int i = 0; i < 26; i++)
        {
            dic[i] = d[i].ToArray();
        }
        var ans = 0L;
        var p = 0;

        foreach (var c in T)
        {
            var cc = c - 'a';
            if (dic[cc].Count() == 0)
            {
                Console.WriteLine(-1);
                return;
            }
        }

        foreach (var c in T)
        {
            var cc = c - 'a';
            //p = d[cc].FirstOrDefault(__ => __ > p);
            p = dic[cc][LowerBound(dic[cc], p + 1)];
            if (p > sl)
            {
                ans += sl;
                p -= sl;
            }
        }
        ans += p;
        Console.WriteLine(ans);
    }
    static void Main(string[] args)
    {
#if DEBUG  
        TESTINPUT();
#else
        INPUT();
#endif
        OUTPUT();
    }

    static void TESTINPUT()
    {
        //programming
        //sentence
        S = "contest";
        T = "sentence";
    }
}

public class Input
{
    public const long MOD = 1000000007;
    public const int INF = 1000000007;
    private static Queue<string> q = new Queue<string>();
    private static void Confirm() { if (q.Count == 0) foreach (var s in Console.ReadLine().Split(' ')) q.Enqueue(s); }
    public static int NextInt() { Confirm(); return int.Parse(q.Dequeue()); }
    public static long NextLong() { Confirm(); return long.Parse(q.Dequeue()); }
    public static string NextString() { Confirm(); return q.Dequeue(); }
    public static double NextDouble() { Confirm(); return double.Parse(q.Dequeue()); }
    public static int[] LineInt() { return Console.ReadLine().Split(' ').Select(int.Parse).ToArray(); }
    public static long[] LineLong() { return Console.ReadLine().Split(' ').Select(long.Parse).ToArray(); }
    public static string[] LineString() { return Console.ReadLine().Split(' ').ToArray(); }
    public static double[] LineDouble() { return Console.ReadLine().Split(' ').Select(double.Parse).ToArray(); }
}

class Util
{
    /// <summary>
    /// 指定した値以上の先頭のインデクスを返す
    /// </summary>
    /// <typeparam name="T">比較する値の型</typeparam>
    /// <param name="arr">対象の配列（※ソート済みであること）</param>
    /// <param name="start">開始インデクス [inclusive]</param>
    /// <param name="end">終了インデクス [exclusive]</param>
    /// <param name="value">検索する値</param>
    /// <param name="comparer">比較関数(インターフェイス)</param>
    /// <returns>指定した値以上の先頭のインデクス</returns>
    public static int LowerBound<T>(T[] arr, int start, int end, T value, IComparer<T> comparer)
    {
        int low = start;
        int high = end;
        int mid;
        while (low < high)
        {
            mid = ((high - low) >> 1) + low;
            if (comparer.Compare(arr[mid], value) < 0)
                low = mid + 1;
            else
                high = mid;
        }
        return low;
              
    }
    public static int LowerBound(int[] ar, int val)
    {
        var lb = -1;
        var ub = ar.Length;

        while (ub - lb > 1)
        {
            var mid = (lb + ub) / 2;
            if (ar[mid] >= val)
            {
                ub = mid;
            }
            else
            {
                lb = mid;
            }
        }

        return ub;
    }

    //引数省略のオーバーロード
    public static int LowerBound<T>(T[] arr, T value) where T : IComparable
    {
        return LowerBound(arr, 0, arr.Length, value, Comparer<T>.Default);
    }
}