Problem:
Problem D: AABABCAC
Problem
文字列$s$,$t$が与えられる。
最初、文字列集合$A=${$s$},$B=\phi$とする。
このとき、次の操作をできるだけたくさん行いたい。
操作
step1
全ての $u ∊ A$ について、以下の処理を行う。
$u$の全ての部分列(連続でなくてもよい)から、$t$と等しいものを任意に1つ選ぶ。選んだ部分列の$u$に対応するインデックスをそれぞれ$z_1$, $z_2$, …, $z_{|t|}$とする(ただし1 $\le$ $z_1$ $\lt$ $z_2$ $\lt$ … $\lt$ $z_{|t|}$ $\le$ $|u|$)。そのような部分列がなければ操作を終了する。
選んだ部分列の文字$u_{z_1}$, $u_{z_2}$, …, $u_{z_{|t|}}$でもとの文字列を分割し、それらを$B$に追加する。
例えば、$u=$"abcdcd", $t=$"ac"の場合は次の2通りの分割の方法が考えられる。
$u$の1番目の文字と3番目の文字を選んだ場合、""と"b"と"dcd"に分割される。
$u$の1番目の文字と5番目の文字を選んだ場合、""と"bcd"と"d"に分割される。
step2
$A$を$B$に置き換え、$B$を空にする。
操作回数を1増やす。
部分列の例
"abac"の部分列は、
  { "" , "a" , "b" , "c" , "aa" ,"ab" , "ac" , "ba" , "bc" , "aac" , "aba" , "abc" , "bac" , "abac" }
  である。
"a"は"abac"の1文字目、または3文字目を抜き出すことによってできた部分列である。
"ac"は"abac"の1文字目と4文字目、または3文字目と4文字目を抜き出すことによってできた部分列である。
Input
入力は以下の形式で与えられる。
$s$
$t$
1行目に文字列$s$,2行目に文字列$t$が与えられる。
Constraints
入力は以下の条件を満たす。
1 $\le$ $|t|$ $\le$ $|s|$ $\le$ $10^5$
文字列$s$,$t$に含まれる文字はアルファベットの大文字または小文字
Output
操作回数の最大値を出力せよ。
Sample Input 1
AABABCAC
A
Sample Output 1
2
1回目の操作は、$A=${ "AABABCAC" }で始まる。
step1では、$u=$"AABABCAC"に対して、例えば4番目の文字を$t$と等しい部分列として選び、"AAB"と"BCAC"に分割し、それらを$B$に追加する。
step2では、$A$を$B$に置き換え、$B$を空にし、操作回数は1となる。
2回目の操作は、$A=${ "AAB" , "BCAC" }で始まる。
step1では、$u=$"AAB"に対して、例えば1番目の文字を$t$と等しい部分列として選び、""と"AB"に分割し、それらを$B$に追加する。次に$u=$"BCAC"に対して、3番目の文字を$t$と等しい部分列として選び、"BC"と"C"に分割し、それらを$B$に追加する。
step2では、$A$を$B$に置き換え、$B$を空にし、操作回数は2となる。
3回目の操作は、$A=${ "" , "AB" , "BC" , "C" }で始まる。
step1では、$u=$""に対して、$t$と等しい部分列が存在しないため、ここで操作を終了する。
この例の場合、3回目の操作ではstep1で操作が終了したため、操作回数は2となる。
Sample Input 2
abaabbabaabaabbabbabaabbab
ab
Sample Output 2
3
Sample Input 3
AbCdEfG
aBcDeFg
Sample Output 3
0

Submitted solutions:

code_snippet: #include <bits/stdc++.h>
using namespace std;
#define _MACRO(_1, _2, _3, NAME, ...) NAME
#define _repl(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define _rep(i,n) _repl(i,0,n)
#define rep(...) _MACRO(__VA_ARGS__, _repl, _rep)(__VA_ARGS__)
#define mp make_pair
#define pb push_back
#define all(x) begin(x),end(x)
#define uniq(x) sort(all(x)),(x).erase(unique(all(x)),end(x))
#define fi first
#define se second
#define dbg(...) _dbg(#__VA_ARGS__, __VA_ARGS__)
void _dbg(string){cerr<<endl;}
template<class H,class... T> void _dbg(string s,H h,T... t){int l=s.find(',');cerr<<s.substr(0,l)<<" = "<<h<<", ";_dbg(s.substr(l+1),t...);}
template<class T,class U> ostream& operator<<(ostream &o, const pair<T,U> &p){o<<"("<<p.fi<<","<<p.se<<")";return o;}
template<class T> ostream& operator<<(ostream &o, const vector<T> &v){o<<"[";for(T t:v){o<<t<<",";}o<<"]";return o;}

int solve(){
  string s,t;
  cin>>s>>t;

  if(s.size() == t.size()){
    if(s==t) return 1;
    else return 0;
  }

  int r = 1;
  int cur = t.size();
  while(s.size() >= cur){
    cur += (cur+1)*t.size();
    r++;
  }

  auto f = [&](int x){
    if(x==0) return true;
    string tt = "";
    rep(i,x){
      string ns = tt;
      rep(j,t.size()) ns += t[j] + tt;
      swap(ns, tt);
    }
    // dbg(x,tt);
    int is=0,it=0;
    while(is<s.size() && it<tt.size()){
      if(s[is] == tt[it]){
        is++; it++;
      } else {
        is++;
      }
    }
    return it == tt.size();
  };

  int l=0;
  while(r-l>1){
    int mid = (l+r)/2;
    if(f(mid)) l = mid;
    else r = mid;
  }
  return l;
}


int main(){
  cout << solve() << endl;

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3464
final_rank: 3

code_snippet: #include <bits/stdc++.h>
using namespace std;
/*{{{*/  //template
#define rep(i,n) for(int i=0;i<(int)(n);i++)
constexpr int INF = numeric_limits<int>::max()/2;
constexpr long long LINF = numeric_limits<long long>::max()/3;
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define all(v) (v).begin(),(v).end()
#define sz(x) (int)(x).size()
#define debug(x) cerr<<#x<<":"<<x<<endl
#define debug2(x,y) cerr<<#x<<","<<#y":"<<x<<","<<y<<endl
//struct fin{ fin(){ cin.tie(0); ios::sync_with_stdio(false); } } fin_;
struct Double{ double d; explicit Double(double x) : d(x){} };
ostream& operator<<(ostream& os,const Double x){ os << fixed << setprecision(20) << x.d; return os; }
template<typename T> ostream& operator<<(ostream& os,const vector<T>& vec){ os << "["; for(const auto& v : vec){ os << v << ","; } os << "]"; return os; }
template<typename T,typename U> ostream& operator<<(ostream& os,const pair<T,U>& p){ os << "(" << p.first << ","<< p.second <<")"; return os; }
template<typename T> ostream& operator<<(ostream& os,const set<T>& st){ os<<"{"; for(T v:st) os<<v<<","; os <<"}"; return os; }
template<typename T,typename U> inline void chmax(T &x,U y){ if(y>x) x = y; }
template<typename T,typename U> inline void chmin(T &x,U y){ if(y<x) x = y; }
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
ll gcd(ll a,ll b){ if(b==0) return a; else return gcd(b,a%b); }
//constexpr double eps = 1e-14; 
constexpr double eps = 1e-10; 
constexpr ll mod = 1e9+7;
const int dx[]={1,0,-1,0} ,dy[] = {0,1,0,-1};
/*}}}*/

string s,t;
int n,m;

// s[idx,n)
// return : 次の場所
int rec(int idx , int depth){
    int idx_  = idx;
    if(depth == 0) return idx;  // そのまま
    if(idx >= n) return -1;
    idx = rec(idx,depth-1);   // 消費 A_n-1
    if(idx == -1) return -1;
    for(int i=0;i<m;i++){
        while(idx < n and t[i] != s[idx]) idx++;
        if(idx >= n) return -1;
        // t[i] == s[idx]
        idx++;
        // s[idx,n)
        idx = rec(idx,depth-1);
        if(idx == -1) return -1;
    }
    //cout << idx_ << " " << depth << " " << idx << endl;
    return idx;
}

int main(){
    cin >> s >> t;
    n = s.size();
    m = t.size();

    //cout << rec(0,3) << endl;
    //return 0;

    int l,r;
    l = 0;
    r = n+1;
    while(r-l>1){
        int mid = (l+r)/2;
        int ret = rec(0,mid);
        //cout << mid << " " << ret << endl;
        if(ret < 0){    // NG
            r = mid;
        }else{          // OK
            l = mid;
        }
    }
    cout << l << endl;
}
accuracy: 1
time_ms: 10
memory_kb: 6428
final_rank: 6

code_snippet: #define FOR(i,j,n) for (int i=(j);i<(n);i++)
#define REP(i,n) for (int i=0;i<(n);i++)
#define REPN(i,n) for (int i=(n);i>=0;i--)
#define I(n) scanf("%d", &(n))
#define LL(n) scanf("%lld", &(n))
#define pb(n) push_back((n))
#define mp(i,j) make_pair((i),(j))
#include <bits/stdc++.h>
using namespace std;

//------------------------------typedef集
typedef vector<int> vi;
typedef pair<int,int> pi;
typedef vector<pi> vpi;
typedef vector<vi> vvi;
typedef vector<vpi> vvpi;
typedef vector<vvi> vvvi;
typedef long long ll;

string s,t;
int si,ti,cnt;

int main(){
    cnt = 1;
    cin >> s;
    cin >> t;

    int tsz = t.size();
    int si;
    while(1){
        int ssz = s.size();
        si = 0;
        for(;si<ssz;si++){
            if (s[si] == t[ti]){
                ti++;
                s.erase(s.begin()+si);
                si--;
                ssz--;
                if (ti == tsz){
                    ti = 0;
                    cnt++;
                    break;
                }
            }
        }
        if (si == ssz) break;
    }

    int ans = 0;
    while (cnt){
        ans++;
        cnt /= 2;
    }
    cout << ans-1 << endl;
}
accuracy: 0.29545454545454547
time_ms: 10
memory_kb: 3240
final_rank: 9

code_snippet: #include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <array>
#include <bitset>
#include <assert.h>
using namespace std;

#define REP(i,n) for(int i=0; i<n; ++i)
#define FOR(i,a,b) for(int i=a; i<=b; ++i)
#define FORR(i,a,b) for (int i=a; i>=b; --i)
#define ALL(c) (c).begin(), (c).end()

typedef long long ll;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef vector<VI> VVI;
typedef vector<VL> VVL;
typedef pair<int,int> P;
typedef pair<ll,ll> PL;

int in() { int x; scanf("%d", &x); return x; }
ll lin() { ll x; scanf("%lld", &x); return x; }

string s, t;
int n, m, i;
bool ok;

void check(int d, int k){
    if (d == k - 1){
        int j = 0;
        while (i < n){
            if (s[i] == t[j]){
                j++;
            }
            i++;
            if (j == m) break;
        }
        if (j < m) ok = false;
    }else{
        int j = 0;
        check(d + 1, k);
        while (i < n){
            if (s[i] == t[j]){
                i++;
                j++;
                check(d + 1, k);
                if (j == m) break;
            }else{
                i++;
            }
        }
        if (j < m) ok = false;
    }
}

int main() {
    cin >> s >> t;

    n = s.length(), m = t.length();

    int ans = 0;
    FOR(k,1,20){
        // cout << "check " << k << endl;
        ok = true;
        i = 0;
        check(0, k);

        if (ok) ans = k;
    }

    cout << ans << endl;

    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3332
final_rank: 2

code_snippet: #include <bits/stdc++.h>

using namespace std;

#define DBG cerr << '!' << endl;
#define REP(i,n) for(ll (i) = (0);(i) < (n);++i)
#define rep(i,s,g) for(ll (i) = (s);(i) < (g);++i)
#define rrep(i,s,g) for(ll (i) = (s);i >= (g);--(i))
#define PB push_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {for(int W = 0;W < (n);W++)cerr << v[W] << ' ';cerr << endl << endl;}
#define SHOW2d(v,i,j) {for(int aaa = 0;aaa < i;aaa++){for(int bbb = 0;bbb < j;bbb++)cerr << v[aaa][bbb] << ' ';cerr << endl;}cerr << endl;}
#define ALL(v) v.begin(),v.end()
#define Decimal fixed<<setprecision(10)
#define INF 1000000000
#define MOD 1000000007

typedef long long ll;
typedef pair<ll,ll> P;

string S;
string T;
int place;

bool dfs(int depth){
	if(depth <= 0)return true;
	if(!dfs(depth-1))return false;
	REP(i,T.size()){
		while(S[place] != T[i])
		{
			//cout << S[place];
			place++;
			if(place >= S.size())return false;
		}
		//cout << depth;
		place++;
		if(depth>1 && place >= S.size())return false;
		if(!dfs(depth-1))return false;
	}	
	
	return true;
}

int main()
{
	cin >> S >> T;
	//cout << S.size() << endl;
	//cout << T.size() << endl;
	int ans = 0;
	while(1){
		//cout << endl;
		place = 0;
		if(dfs(ans))ans++;
		else break;
	}
	//cout << endl;
	cout << ans-1 << endl;
	
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3288
final_rank: 1

code_snippet: #include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll, ll> P;

#define fi first
#define se second
#define repl(i,a,b) for(ll i=(ll)(a);i<(ll)(b);i++)
#define rep(i,n) repl(i,0,n)
#define all(x) (x).begin(),(x).end()
#define dbg(x) cout<<#x"="<<x<<endl
#define mmax(x,y) (x>y?x:y)
#define mmin(x,y) (x<y?x:y)
#define maxch(x,y) x=mmax(x,y)
#define minch(x,y) x=mmin(x,y)
#define uni(x) x.erase(unique(all(x)),x.end())
#define exist(x,y) (find(all(x),y)!=x.end())
#define bcnt __builtin_popcount

#define INF 1e16
#define mod 1000000007

string s,t;
int sa[100010],ta[100010];
int n,m;
int nxt[100010][52];
string b[20];
vector<int> ba[20];

int main(){
  cin>>s>>t;
  n=s.size();
  m=t.size();
  rep(i,n){
    if(s[i]>='A'&&s[i]<='Z')sa[i]=s[i]-'A';
    else sa[i]=s[i]-'a'+26;
  }
  rep(i,n){
    if(t[i]>='A'&&t[i]<='Z')ta[i]=t[i]-'A';
    else ta[i]=t[i]-'a'+26;
  }
  b[0]=t;
  rep(i,b[0].size()){
    if(b[0][i]>='A'&&b[0][i]<='Z')ba[0].push_back(b[0][i]-'A');
    else ba[0].push_back(b[0][i]-'a'+26);
  }
  repl(i,1,20){
    if(m*b[i-1].size()>n)break;
    rep(j,m){
      b[i]+=b[i-1];
      b[i]+=t[j];
    }
    b[i]+=b[i-1];
    rep(j,b[i].size()){
      if(b[i][j]>='A'&&b[i][j]<='Z')ba[i].push_back(b[i][j]-'A');
      else ba[i].push_back(b[i][j]-'a'+26);
    }
  }
  memset(nxt,-1,sizeof(nxt));
  for(int i=n-1;i>=0;i--){
    for(int j=0;j<52;j++){
      if(sa[i]==j)nxt[i][j]=i+1;
      else nxt[i][j]=nxt[i+1][j];
    }
  }
  rep(i,20){
    int crt=0;
    if(ba[i].size()==0){
      cout<<i<<endl;
      return 0;
    }
    rep(j,ba[i].size()){
      int nxti=nxt[crt][ba[i][j]];
      if(nxti<0){
        cout<<i<<endl;
        return 0;
      }
      crt=nxti;
    }
  }
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 24848
final_rank: 7

code_snippet: #ifndef VS
#include<bits/stdc++.h>
#endif

using namespace std;
typedef long long LL;

#ifdef BTK
#define DEBUG if(1)
#else
#define CIN_ONLY if(1)
struct cww {cww() {CIN_ONLY{ios::sync_with_stdio(false); cin.tie(0);}}
}star;
#define DEBUG if(0)
#endif

#define ALL(v) (v).begin(),(v).end()
#define REC(ret, ...) std::function<ret (__VA_ARGS__)>
template <typename T>inline bool chmin(T &l, T r){bool a = l>r; if (a)l = r; return a;}
template <typename T>inline bool chmax(T &l, T r){bool a = l<r; if (a)l = r; return a;}
template <typename T>istream& operator>>(istream &is, vector<T> &v){for (auto &it : v)is >> it;return is;}

class range {private: struct I { int x; int operator*() { return x; }bool operator!=(I& lhs) { return x<lhs.x; }void operator++() { ++x; } }; I i, n;public:range(int n) :i({ 0 }), n({ n }) {}range(int i, int n) :i({ i }), n({ n }) {}I& begin() { return i; }I& end() { return n; }};

string s, t;
bool ok;
void f(int depth, string &ret) {
	if (depth == 0)return;
	f(depth - 1, ret);
	for (auto &it : t) {
		ret += it;
		if (ret.size() > s.size()) {
			ok = false;
			return;
		}
		f(depth - 1,ret);
	}
}
string g(int depth) {
	ok = true;
	string ret = "";
	f(depth, ret);
	if(ok)return ret;
	else return "";
}
bool check(string x) {
	if (x.size() == 0)return false;
	int n = s.size();
	int m = x.size();
	int j = 0;
	for (int i : range(n)) {
		if (s[i] == x[j])j++;
		if (j == m)return true;
	}
	return false;
}
int main() {
	while (cin >> s >> t) {
		int ub = s.size() + 1;
		int lb = 0;
		while (ub - lb > 1) {
			const int mid = (lb + ub) / 2;
			string x = g(mid);
			(check(x) ? lb : ub) = mid;
		}
		cout << lb << endl;
	}
	return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 6576
final_rank: 8

code_snippet: #include <bits/stdc++.h>

using namespace std;

string s, t;
int n, m;

string u;

bool build() {
  string tmp = u;
  for(int i = 0; i < m; ++i) {
    u += t[i]+tmp;
    if(u.size() > s.size()) return false;
  }
  return true;
}

int main() {
  cin >> s >> t;
  n = s.size();
  m = t.size();
  u = "";
  for(int i = 0; i < 20; ++i) {
    int k = 0;
    for(int j = 0; j < n && k < (int)u.size(); ++j) {
      if(s[j] == u[k]) ++k;
    }
    if(k != (int)u.size()) {
      cout << i-1 << endl;
      return 0;
    }
    if(!build()) {
      cout << i << endl;
      return 0;
    }
  }

  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3588
final_rank: 5

code_snippet: #include <bits/stdc++.h>
#define GET_MACRO(_1,_2,_3,_4,_5,NAME,...) NAME
#define pr(...) GET_MACRO(__VA_ARGS__,pr5,pr4,pr3,pr2,pr1)(__VA_ARGS__)
#define pr1(a) (#a)<<"="<<(a)
#define pr2(a,b) pr1(a)<<", "<<pr1(b)
#define pr3(a,b,c) pr2(a,b)<<", "<<pr1(c)
#define pr4(a,b,c,d) pr3(a,b,c)<<", "<<pr1(d)
#define pr5(a,b,c,d,e) pr4(a,b,c,d)<<", "<<pr1(e)
#define int long long
#define double long double
using namespace std;
const int N = 100010;
const int INF = 1LL<<55;
const int mod = (1e9)+7;
const double EPS = 1e-8;
const double PI = 6.0 * asin(0.5);
typedef pair<int,int> P;
typedef long long ll;
template<class T> T Max(T &a,T b){return a=max(a,b);}
template<class T> T Min(T &a,T b){return a=min(a,b);}
ostream& operator<<(ostream& o,P p){return o<<"("<<p.first<<","<<p.second<<")";}
istream& operator>>(istream& i,P &p){return i>>p.first>>p.second;}
ostream& operator<<(ostream& o,vector<auto> &a){int i=0;for(auto t:a)o<<(i++?" ":"")<<t;return o;}
istream& operator>>(istream& i,vector<auto> &a){for(auto &t:a)i>>t;return i;}
void prArr(auto a,string s=" "){int i=0;for(auto t:a)cout<<(i++?s:"")<<t;cout<<endl;}
string s,t;

string dfs(int dep){
  if(dep == 1) return t;
  string u = dfs(dep-1);
  if(u == "$") return "$";
  string res = u;
  for(char ch:t) {
    if(res.size() > s.size()) return "$";
    res += ch, res += u;
  }
  return res; 
}

bool check(const string &u){
  int idx = 0;
  for(char ch:s)
    if(idx < (int)u.size() && u[idx] == ch) idx++;
  return idx == (int)u.size();
}

signed main(){
  cin>>s>>t;
  
  int ans = 0;
  for(int i=1;i<=20;i++){
    string u = dfs(i);
    if(check(u)) ans = i;
  }
  cout<<ans<<endl;
  
  return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3512
final_rank: 4