[题解]AT_abc299_f [ABC299F] Square Subsequence

思路

首先先考虑弱化版怎么做,即如何求本质不同子序列数量。

不妨定义 \(dp_{i}\) 在前 \(i\) 位中选,且以 \(i\) 结尾的本质不同子序列数量。

显然,有(其中 \(nxt_{i,c}\) 表示在 \(i\) 之后,第一次出现 \(c\) 的位置):

\[ dp_{i} \rightarrow dp_{nxt_{i,c}} \]

本题中的 \(TT\) 是由两个 \(T\) 拼接而成,所以考虑枚举两个 \(T\) 的起始位置 \(i,j\)

在这里定义 \(dp_{i,j}\) 表示两个 \(T\) 分别以 \(i,j\) 结尾的本质不同子序列数量。

再枚举一下两个 \(T\) 倒数第二个字符的位置,记作 \(l,r\),并且枚举这个字符 \(c\)

那么,如果想使 \(T\) 继续延伸,那么,必须使新扩展的字符相同。因此,记 \(nl = nxt_{l,c},nr = nxt_{r,c}\)

根据上述求本质不同子序列数量的状态转移方程,可得:

\[ dp_{nl,nr} = dp_{nl,nr} + dp_{l,r} \]

在统计答案的时候,不能直接将所有 \(dp_{i,j}\) 加起来,这样会导致重复计算。所以,我们令 \(T\) 取最前面的字符。

Code

#include <bits/stdc++.h>  
#define int long long  
#define re register  
  
using namespace std;  
  
const int N = 110,mod = 998244353;  
int n,ans;  
int nxt[N][N],dp[N][N];  
string s;  
  
signed main(){  
    ios::sync_with_stdio(0);  
    cin.tie(0);  
    cout.tie(0);  
    cin >> s;  
    n = s.length();  
    s = ' ' + s;  
    for (re char c = 'a';c <= 'z';c++) nxt[n][c - 'a'] = n + 1;//预处理 nxt   
    for (re int i = n - 1;~i;i--){  
        for (re char c = 'a';c <= 'z';c++) nxt[i][c - 'a'] = nxt[i + 1][c - 'a'];  
        nxt[i][s[i + 1] - 'a'] = i + 1;  
    }  
    for (re int j = 2;j <= n;j++){  
        int i = nxt[0][s[j] - 'a'];  
        if (i >= j) continue;  
        memset(dp,0,sizeof(dp));  
        dp[i][j] = 1;//i,j 显然合法,贡献为 1   
        for (re int l = 1;l <= n;l++){  
            for (re int r = l + 1;r <= n;r++){  
                for (re char c = 'a';c <= 'z';c++){  
                    int nl = nxt[l][c - 'a'];  
                    int nr = nxt[r][c - 'a'];  
                    if (nl >= r || nr > n) continue;  
                    dp[nl][nr] = (dp[nl][nr] + dp[l][r]) % mod;  
                }  
            }  
        }  
        for (re int l = 1;l <= n;l++){  
            for (re int r = l + 1;r <= n;r++){  
                if (nxt[l][s[j] - 'a'] == j) ans = (ans + dp[l][r]) % mod;//要取最前面的   
            }  
        }  
    }  
    printf("%lld",ans);  
    return 0;  
}  
posted @ 2024-06-23 00:26  WBIKPS  阅读(18)  评论(0)    收藏  举报