#include <bits/stdc++.h>   using namespace std;   const int INF = 1791791791;   const long long INFLL = 1791791791791791791ll;   template <int input_buf_size, int output_buf_size>   class FastIO {     char cbuf[input_buf_size + 1];     int icur = 0;     inline bool go_to_next_token() {       while (cbuf[icur] ==     || cbuf[icur] ==   n ) icur++;       while (cbuf[icur] == 0) {         icur = 0;         if (fgets(cbuf, sizeof(cbuf), stdin) != cbuf) return false;         while (cbuf[icur] ==     || cbuf[icur] ==   n ) icur++;       }       return true;     }       public:     string readString() {       assert(go_to_next_token());       string ans;       while (cbuf[icur] !=     && cbuf[icur] !=   n  && cbuf[icur] != 0)         ans.push_back(cbuf[icur++]);       ans.shrink_to_fit();       return ans;     }     template <class int_type>     int_type readInt() {       assert(go_to_next_token());       int_type x = 0;       bool m = cbuf[icur] ==  - ;       if (m) icur++;       while ( 0  <= cbuf[icur] && cbuf[icur] <=  9 ) {         x *= 10;         x += (cbuf[icur] -  0 );         icur++;       }       if (m) x = -x;       return x;     }     bool seekEof() { return !go_to_next_token(); }       private:     char obuf[output_buf_size + 1];     int ocur = 0;     inline void write_string(const char* str, size_t sz = 0) {       if (sz == 0) sz = strlen(str);       if (ocur + sz > output_buf_size) {         fputs(obuf, stdout);         fputs(str, stdout);         ocur = 0;         obuf[0] = 0;         return;       }       strcpy(obuf + ocur, str);       ocur += sz;       obuf[ocur] = 0;     }       public:     template <class int_type>     void writeInt(int_type x, bool sp = true) {       char buf[20];       int c = 0;       if (x < 0) {         buf[c++] =  - ;         x = -x;       }       int s = c;       if (x == 0) {         buf[c++] =  0 ;       }       while (x > 0) {         buf[c++] = (x % 10) +  0 ;         x /= 10;       }       for (int i = 0; 2 * i < c - s; i++) {         swap(buf[s + i], buf[c - 1 - i]);       }       buf[c] = 0;       write_string(buf, c);       if (sp) write_string(   , 1);     }     void writeString(string s, bool space = true) {       write_string(s.c_str(), s.size());       if (space) write_string(   , 1);     }     void writeEndl() { write_string(  n , 1); }     void flush() {       fputs(obuf, stdout);       ocur = 0;       obuf[0] = 0;     }       private:     bool lflush;       public:     FastIO(bool local_flush) {       obuf[0] = 0;       lflush = local_flush;     }     ~FastIO() { fputs(obuf, stdout); }   };   FastIO<10000000, 10000000> IO(true);   bool is_subsequence(const string& s, const string& t) {     int i = 0, j = 0;     while (i < (int)s.size() && j < (int)t.size()) {       if (s[i] == t[j]) j++;       i++;     }     return j == (int)t.size();   }   int main() {     string s, t;     s = IO.readString(), t = IO.readString();     int n = s.size();     vector<int> a(n);     for (int i = 0; i < ((int)(n)); ++i) a[i] = IO.readInt<int>() - 1;     int l = 0, r = n;     while (l < r - 1) {       int mid = (l + r) >> 1;       vector<int> b(a.begin() + mid, a.end());       sort((b).begin(), (b).end());       string ns;       for (int i : b) ns.push_back(s[i]);       if (is_subsequence(ns, t))         l = mid;       else         r = mid;     }     IO.writeInt(l);     IO.writeEndl();     return 0;   }