//
#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int N=111;
bool dp[N][N]; // s1 前 i 个字符通过删除 0 或 k 对 "()",变成 s2 前 j 个字符的可行性为 dp[i][j]
void solve()
{
string s1,s2;
int i,j;
cin>>s1>>s2;
// s1 前 i 个字符通过删除 0 或 k 对 "()",变成 s2 前 0 个字符的可行性为 1
for( i=0;i<=s1.size();i++ ) dp[i][0]=1;
for( i=1;i<=s1.size();i++ )
for( j=1;j<=s2.size();j++ )
{
// i-1 j-1 表示的都是字符下标,i j 表示的都是字符串的前 X 个字符
// 当对应字符下标相等时 可行性 才可继承
dp[i][j]=( s1[i-1]==s2[j-1] ) & dp[i-1][j-1];
/*
首先题面明确指出 s1 合法
s1 s2
( ( :对应字符下标相等,但 s1 明确合法,不考虑删除 "()"
( ) :对应字符下标不相等,但 s1 明确合法,不考虑删除 "()"
) ( :对应字符下标不相等,但合法的 s1 存在以 ')' 结尾的子序列,可以考虑删除 "()"
) ) :对应字符下标不相等,且合法的 s1 存在以 ')' 结尾的子序列,可以考虑删除 "()"
*/
if( s1[i-1]==')' )
{
int cnt=1,idx=i-2;
// 注意 idx-- 需要回撤操作
while( cnt>0 ) s1[idx--]==')' ? cnt++ : cnt-- ;
// 当 cnt==0 时,[idx+1,j] 显然合法,考虑 [1,idx] 合法性即可
dp[i][j]|=dp[idx+1][j];
}
}
printf("%s\n",dp[s1.size()][s2.size()] ? "Possible\n" : "Impossible\n" );
}
signed main()
{
solve();
return 0;
}
作者 | 乐意奥AI