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 (GCC 5.4.1) (judge verdict: Accepted)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define N 200000
int A[26][N]={0}, pos[26]={0};
int NEXT[26][N]={0};

int  main(){
  int l, i, tmp, ex, cur, j, prev, st, zz;
  long long int loop=0;
  char s[N], t[N];
  scanf("%s", s);
  scanf("%s", t);
  for (i=0; i<26; i++){
    for (j=0; j<N; j++){
      NEXT[i][j]=-1;
    }
  }

  l=strlen(s);  
  for (i=0; i<l; i++){
    tmp=s[i]-'a';
    A[tmp][pos[tmp]]=i; 
    if (pos[tmp]==0) st=-1; else st=A[tmp][pos[tmp]-1];
    for (j=st; j<i; j++) NEXT[tmp][j+1]=i;
    pos[tmp]++;
  }

/*
  for (i=0; i<26; i++){
    for (j=0; j<10; j++){
      printf("%d ", NEXT[i][j]);
    }
    printf("\n");
  }
*/

  
  cur=-1;
  for (i=0; i<strlen(t); i++){
 //   printf("%lld %d\n", loop, cur);
    tmp=t[i]-'a';
  //  printf("%c\n", tmp+'a');
    ex=0;
    if (pos[tmp]==0) {
      printf("-1\n"); return 0;
    }
    zz=NEXT[tmp][cur+1]; 
    if (zz>cur) {
        ex=1; cur=zz; continue;
    }
    cur=A[tmp][0]; loop++;
  }
  printf("%lld\n", loop*strlen(s)+cur+1);
  return 0;
}