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: Wrong Answer)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace AtCoder
{
	public class Program
	{
		//static int[] parent;
		static void Main(string[] args)
		{
			string s = Console.ReadLine();
			string t = Console.ReadLine();
			int slen = s.Length;
// sに使われているアルファベットと、その位置を持っておくリスト
			List<List<int>> pos = new List<List<int>>();
			for(int i=0; i<26; i++)
				pos.Add(new List<int>());

			for(int i=0; i<slen; i++)
			{
				pos[s[i]-'a'].Add(i);
			}
			int[] dp = new int[t.Length];
			//Console.WriteLine(find + " find " + copy);
			int cur = -1; // sの文字列の何文字目まで探しているか？s長を超えたらdp[i]に1足す
			for(int i=0; i<t.Length; i++)
			{
							// t[i]を、posのcur文字目より後から探す
				List<int> p = pos[t[i]-'a'];

				if(p.Count == 0)
				{
					// sに含まれないので探索終わり
					Console.WriteLine("-1");
					return;
				}

				cur = biSearch(p, cur, 0, p.Count-1);
				if(cur == -1)
				{
					dp[i] = dp[i-1] + 1;
					// 最初から探し直す
					cur = biSearch(p, cur, 0, p.Count - 1);
				}
				else if(i>0)
				{
					dp[i] = dp[i-1];
				}
				//Console.WriteLine(cur + " "+ t[i] + " " + dp[i]);
			}


			long ret = 0;
			int scount = dp[t.Length-1]; // sの必要な回数
			ret = scount * slen;
			ret += cur+1;

			Console.WriteLine(ret + " ") ;
		}

		static int biSearch(List<int> p, int cur, int start, int end)
		{
			//Console.WriteLine("binarySearch " + cur + " " + start + " " + end);
			// start〜endからcurより後の最小値を探す
			if(cur < p[start])
			{
				return p[start];
			}
			if(cur >= p[end])
			{
				return -1;
			}
			if(end-start <= 1)
			{
				return p[end];
			}

			int a = (start+end)/2;
			if(p[a] > cur)
			{
				return biSearch(p, cur, start, a);
			}
			else
			{
				return biSearch(p, cur, a+1, end);
			}
		}
	}
}