首页 > 其他分享 >CF1679E Typical Party in Dorm

CF1679E Typical Party in Dorm

时间:2024-01-20 15:44:28浏览次数:40  
标签:int CF1679E 字符集 tot Dorm Party Sigma operatorname 问号

Typical Party in Dorm

Luogu CF1679E

题面描述

给定一个长度为 \(n(n\le 1000)\) ,仅由前 \(17\) 个英文小写字母和问号组成的字符串 \(s\)。多次询问,每次给出一个由前 \(17\) 个英文小写字母组成的字符集 \(A\) ,你可以将 \(s\) 中的问号任意替换成 \(A\) 中的字母,求你能得到多少个不同的回文子串(两个子串不同,当且仅当起始位置,长度,两个子串的内容至少一个不同)。

Solution

注意到字符集大小 \(|\Sigma|\) 是 \(17\),很特殊,因此考虑预处理一个字符集所有的答案。

暴力枚举串的回文中心,这里仅讨论长度为奇数的情况,偶数同理。

不难发现,当确定了一个区间过后,字符集中需要含有的字符状态是确定的,所以只需要关心不在这个区间内的问号会对答案产生什么贡献。

设总共的问号个数为 \(\operatorname{tot}\),当前的区间内的确定的问号个数为 \(\operatorname{cnt}\),当前区间确定必须加入字符集的元素为 \(S\),那么考虑扩展左右边界:

  • 两侧均不为问号,且两个字符不同。此时直接退出即可。
  • 两侧均为问号,此时只需要确定一个问号另一个问号也随之确定,因此只需要 \(\operatorname{cnt}\) 加 \(1\)。
  • 一侧为问号,一侧为字符,此时问号确定,将 \(\operatorname{cnt}\) 加 \(1\),并将这个字符加入到 \(S\) 中。

考虑如何统计贡献。显然确定的问号不会对答案产生贡献,而未确定的问号每个都会对答案产生 \(|\Sigma|\) 的贡献。发现最后答案与 \(|\Sigma|\) 相关,因此设 \(f(S,i)\) 表示当前确定的字符集为 \(S\),最后的字符集大小为 \(i\)。那么每次扩展边界都会对 \(f(S,k\in[1,|\Sigma|])\) 带来 \(k^{\operatorname{tot}-\operatorname{cnt}}\) 的贡献。

注意到 \(f(S,k)\) 会对所有 \(S\subseteq T\) 的 \(f(T,k)\) 产生贡献,因此最后对每个 \(f(S,k)\) 做一个子集卷积即可。

时间复杂度 \(\mathcal O(n^2|\Sigma|+|\Sigma|^22^{|\Sigma|})\)。

Code
int N;
char str[_N];
mint f[_M][20];
void init() {
    int tot = 0;
    For(i, 1, N) tot += str[i] == '?';
    For(i, 1, N) {
        auto solve = [&tot](int l, int r) -> void {
            int cnt = tot, sta = 0;
            while (l >= 1 && r <= N) {
                if (str[l] != '?' && str[r] != '?' && str[l] != str[r]) break;
                if (str[l] != '?' && str[r] == '?') sta |= 1 << (str[l] - 'a');
                if (str[l] == '?' && str[r] != '?') sta |= 1 << (str[r] - 'a');
                if (l != r && (str[l] == '?' || str[r] == '?')) --cnt;
                For(j, 1, 17) f[sta][j] += mint(j).pow(cnt);
                --l, ++r;
            }
        };
        solve(i, i), solve(i, i + 1);
    }
    int lim = 1 << 17;
    For(t, 1, 17) {
        for (int i = 1; i < lim; i <<= 1)
            for (int j = 0; j < lim; j += i << 1)
                For(k, 0, i - 1) f[j+k+i][t] += f[j+k][t];
    }
}
signed main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> N;
    For(i, 1, N) cin >> str[i];
    init();
    int Q; cin >> Q;
    while (Q--) {
        string s; cin >> s;
        int sta = 0;
        for (char c: s) sta |= 1 << (c - 'a');
        cout << f[sta][s.length()] << '\n';
    }
}

标签:int,CF1679E,字符集,tot,Dorm,Party,Sigma,operatorname,问号
From: https://www.cnblogs.com/hanx16msgr/p/17976526

相关文章

  • [活动(深圳)] .NET Love AI 之 .NET Conf China 2023 Party 深圳
    中国.NET社区2023年12月16日在北京成功举办了.NETConfChina2023,虽然北京飘起雪,依然挡不住想要参加活动的全国各地的.NET开发兄弟姐妹的热情。大家可以通过大会精彩照片集:https://live.photoplus.cn/live/79415183体验现场的热度。欢迎访问大会官网了解更详细的信息:https://d......
  • Candy Party (Hard Version) 题解
    原题链接:CF1868B2,简单版:CF1868B1。题意有\(n\)个人,第\(i\)个人手上最初有\(a_{i}\)颗糖。现在每个人可以把自己手中的糖选一些给不多于一个人,同时每个人也只能接受不多于一个人的糖,选出的糖的数量必须是二的次幂。问能否能让每个人最终手上的糖的数量相等。思路首先,这......
  • [ARC120E] 1D Party 题解
    提供二分+DP做法。Solution题意给出\(n(\le2\times10^5)\)个单调递增偶整数\(a_i\),求最小的\(k\)满足每一个\(i\)都可以在\(k\)时刻之前(含)与相邻的数相遇。每个单位时间可以移动一个单位距离。思路启发式思考在想到正解之前,我们可以想想类正解。显然,在时间一单......
  • CF1163B2 Cat Party (Hard Edition) 题解
    题意:思路:对于满足条件的区间$[1,x]$,有如下三种情况:$1$.所有元素出现次数都为$1$;$2$.除了一个元素出现次数为$1$之外,其余元素出现次数都相等;$3$.除了一个出现次数比其他数的出现次数多$1$的元素之外,其余元素出现次数都相等。在线处理:设$cnt_i......
  • CF1868B2 Candy Party (Hard Version) 题解
    Problem-1868B2-CodeforcesCandyParty(HardVersion)-洛谷相信大家已经看过SimpleVersion,这题和上题不同之处就在于如果\(b_i=2^x\),他可以被分解成\(2^x\)或\(2^{x+1}-2^x\),我们不妨起初固定一种方案,如果不满足条件后再把一部分换回去。我们强制钦定起......
  • CF1868B1 Candy Party (Easy Version) 题解
    Problem-1868B1-CodeforcesCandyParty(EasyVersion)-洛谷喵喵题。首先每个数最终肯定变成\(\overlinea\),如果\(\overlinea\)不是整数显然无解。然后记\(b_i=a_i-\overlinea\)表示每个数的偏差量,那\(b_i\)要满足能写成\(2^x-2^y\)的形式然后只需要......
  • pgsql create table,cpp fill psql table via the third party library pqxx
    //createtablet1;createtablet1(idbigserialnotnullprimarykey,authorvarchar(40)notnull,commentvarchar(40)notnull,contentvarchar(40)notnull,headervarchar(40)notnull,isbnvarchar(40)notnull,objectvarchar(40)notnull,summaryvarchar(40......
  • Android rescueParty 救援模式
    现象:设备刷机后无法启动,不停重启。 备注:userdebug版本无问题,user版本才有问题。 分析:1.user版本无法获取到logcat日志,但是从获取的串口日志如下:[   89.217156]|01-01 00:02:50.315 reboot: Restarting system with command 'rescueparty'可以看到重启原因是......
  • CF549B Looksery Party
    这些题都是上周五写的了,周末两天因为比赛都没来得及写博客,只能到周一来补一补这题做法很简单,考虑如果当前状态中\(\{a_i\}\)不含有\(0\)的话就已经得到一组合法解了否则我们找到某个\(a_i=0\)的点,钦定让\(i\)这个人去派对即可,这样一定可以满足\(i\)这个人的条件,同时更新带来的影......
  • CF713E Sonya Partymaker
    其实做题可以先算法导向一下的。比如看到显著特征:【最大值最小】,我们第一反应还是应该为二分答案转判定的。考虑二分答案\(d\),此时转化为了,对于每个人\(i\),选择一个朝向左/右,向该朝向覆盖\(d\)的距离,能否将整个环全部覆盖。如果不是环的话,很lantern啊!考虑序列情况,设\(dp......