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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <sstream>
#include <math.h>
#include <queue>
#include <map>
#include <set>
#include <ios>     // std::left, std::right
#include <iomanip> // std::setw(int), std::setfill(char)
using namespace std;

std::string allist="abcdefghijklmnopqrstuvwxyz";

int al_to_num(char al){
for(int i=0;i<26;++i){
  if(allist[i]==al){
    return i;
  }
}  }

int main(){
std::string s,t;
cin>>s;
cin>>t;
char target;
long long target_num;
long long s_list[26][100010]={};
vector<long long> t_list;
long long s_len=s.size();
for(int i=s_len-1;i>=0;i--){
  target=s[i];
  target_num=al_to_num(target);
  if(i==s_len-1){
    for(int j=0;j<26;++j){
      s_list[j][s_len-1]=-1;
    }
    s_list[target_num][s_len-1]=s_len-1;
  }
  else{
  for(int j=0;j<26;++j){
    if(j==target_num){
      s_list[j][i]=i;
    }
    else{
      s_list[j][i]=s_list[j][i+1];
    }
  }}
}
for(int i=0;i<t.size();++i){
  target=t[i];
  target_num=al_to_num(target);
  t_list.push_back(target_num);
}
long long ans=0;
long long next;
for(int i=0;i<t_list.size();++i){
  //targetを探しに行く
  target_num=t_list[i];
  next=s_list[target_num][ans%s_len];
  //nextが次のsの時
  if(next==-1){
    ans+=(s_len-ans%s_len);
    next=s_list[target_num][ans%s_len];
    if(next==-1){
      ans=-2;
      break;
    }
  }
  ans+=(next-ans%s_len);
}
cout<<ans+1<<"\n";
return 0;
}