括号串
T串是S串的一种合法的补全方式满足下列条件:
- T本身串是匹配的
- S串是T串的子序列
#include<bits/stdc++.h>
using namespace std;
const int mod = 998244353;
const int maxn = 1e6 + 9;
char s[maxn], t[maxn], st[maxn];
int T, n, m;
bool check()
{
int top = 0;
for(int i = 0; i < m; ++i)
{
if(t[i] == '(' || t[i] == '[') st[++top] = t[i];
else
{
if(t[i] == ']' && top > 0 && st[top] == '[') top--;
else if(t[i] == ')' && top > 0 && st[top] == '(') top--;
else return 0;
}
}
if(top) return 0;
return 1;
}
int main()
{
cin >> T;
while(T--)
{
scanf("%d %d", &n, &m);
scanf("%s",s); scanf("%s",t);
if(!check()){
puts("Wrong Answer");continue;
}
int i, j;
for(j = 0, i = 0; i < m; ++i)
{
if(s[j] == t[i]) ++j;
if(j == n){
puts("Accepted"); break;
}
}
if(j != n){
puts("Wrong Answer");
}
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll mod = 1e9 + 7;
ll dp[5000010];
ll sz[24] = {0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304};
ll n, m;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
//多重背包有上限求方案数的模板
dp[0] = 1;
for (int i = 1 ; i <= 23 ; i++) {
for (int j = sz[i] ; j <= m ; j++) {
dp[j] = (dp[j] + dp[j - sz[i]]) % mod;
}
for (int j = m ; j >= (n + 1) * sz[i] ; j--) {
dp[j] = (dp[j] - dp[j - (n + 1) * sz[i]] + mod) % mod;
}
}
cout << dp[m] << "\n";
return 0;
}