杭电多校 7Yiwen with Sqc (数学)

题意:

字符串的子串当中每个字母的出现个数(用 s [ ′ a ′ ] [ l , r ]来表示),要求的就是每个字母的所有 s [ l , r ] s[l, r]s[l,r] 的平方和

分析:

首先我们用dp[i]表示以i做结尾的贡献:
之后我们来分析:每次多加上当前字符 会多造成多少贡献:

以ababaa为例 比样例多了个a
?和/表示没有字符 对起作用
??/??a 贡献是 1 2 1^2 12
??/?aa 贡献是 2 2 2^2 22
???baa 贡献是 2 2 + 1 2 2^2+1^2 22+12
??abaa 贡献是 3 2 + 1 1 3^2+1^1 32+11
?babaa 贡献是 2 2 + 3 2 2^2+3^2 22+32
ababaa 贡献是 2 2 + 4 2 2^2+4^2 22+42

对比一下前一位的a贡献,也就是ababa
??/?a 贡献是 1 2 1^2 12
???ba 贡献是 1 2 + 1 2 1^2+1^2 12+12
??aba 贡献是 2 2 + 1 1 2^2+1^1 22+11
?baba 贡献是 2 2 + 2 2 2^2+2^2 22+22
ababa 贡献是 2 2 + 3 2 2^2+3^2 22+32

我们相加一下,看看都多了那些东西:

??/??a 贡献是 1 2 1^2 12
??/?aa 多贡献是 2 2 − 1 2 2^2-1^2 2212
???baa 多贡献是 2 2 + 1 2 − 1 2 − 1 2 2^2+1^2-1^2-1^2 22+121212
??abaa 多贡献是 3 2 + 1 1 − 2 2 − 1 2 3^2+1^1-2^2-1^2 32+112212
?babaa 多贡献是 2 2 + 3 2 − 2 2 − 2 2 2^2+3^2-2^2-2^2 22+322222
ababaa 多贡献是 2 2 + 4 2 − 3 2 − 2 2 2^2+4^2-3^2-2^2 22+423222

整合下 1 2 + ( 2 2 − 1 2 ) + ( 2 2 − 1 2 ) + ( 3 2 − 2 2 ) + ( 3 2 − 2 2 ) + ( 4 1 − 3 2 ) 1^2+(2^2-1^2)+(2^2-1^2)+(3^2-2^2)+(3^2-2^2)+(4^1-3^2) 12+(2212)+(2212)+(3222)+(3222)+(4132)
然后我们为一位就是当前位上会有1贡献 因为有6项所以加上6 对上面先剪掉6看一下:
说后面的时候 先看平方差公式: ( a + 1 ) 2 − a 2 (a+1)^2-a^2 (a+1)2a2= (a+a+1)=2a+1
上面说我们对每项-1,所以变成
( 2 2 − 1 2 − 1 ) + ( 2 2 − 1 2 − 1 ) + ( 3 2 − 2 2 − 1 ) + ( 3 2 − 2 2 − 1 ) + ( 4 1 − 3 2 − 1 ) (2^2-1^2-1)+(2^2-1^2-1)+(3^2-2^2-1)+(3^2-2^2-1)+(4^1-3^2-1) (22121)+(22121)+(32221)+(32221)+(41321)
再根据我们上面的平方差公式得:
2 ∗ 1 + 2 ∗ 1 + 2 ∗ 2 + 2 ∗ 3 2*1+2*1+2*2+2*3 21+21+22+23 也就是2*前面这个字符的位置,所以我们只需要记录前面字符位置和即可。然后加上当前字符位置。

递归方程就为:
d p [ i ] = d p [ i − 1 ] + 2 ∗ s u m [ n u m ] + i dp[i]=dp[i-1]+2*sum[num]+i dp[i]=dp[i1]+2sum[num]+i
num表示当前字符。sum表示前面字符位置和。

void solve() {
	int t;
    cin >> t;
    while (t--) {
        memset(cnt, 0, sizeof(cnt));
        memset(sum, 0, sizeof(sum));
        scanf("%s", s + 1);
        int n = strlen(s + 1);
        ll ans = 0;
        for (int i = 1; i <= n; i++) {
            int now = s[i] - 'a' + 1;
            dp[i] = (dp[i - 1] + 2 * sum[now] + i) % mod;
            sum[now] = (sum[now] + i) % mod;
            ans = (ans + dp[i]) % mod;
            cout<<dp[i]<<" ";
        }
        printf("%lld\n", ans);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是其他几篇2022年关于图像分类的外文文献和相关代码地址: 1. 论文题目:"Adversarial Training with Feature Ensembles for Robust Image Classification" 论文作者:Yinpeng Chen, Haibo Chen, Jingyi Wang, and Liang Lin 期刊/会议:CVPR 2022 论文简介:本文提出了一种基于特征集成的对抗训练方法,用于提高图像分类模型的鲁棒性。该方法利用不同的特征提取器进行训练,并通过对抗样本生成器来增强模型的鲁棒性。实验结果表明,该方法可以有效地提高图像分类的准确率和鲁棒性。 代码地址:https://github.com/yinpengchen/Adv-Ensemble 2. 论文题目:"Multi-Scale Attention for Image Classification" 论文作者:Shiwei Zhang, Zhiyuan Chen, Xiaolin Hu, and Jun Zhu 期刊/会议:CVPR 2022 论文简介:本文提出了一种基于多尺度注意力机制的图像分类方法,称为MSA。该方法可以自适应地学习不同尺度的特征表示,并在分类任务中取得了最先进的性能。MSA采用一种新的注意力损失函数,可以有效地训练深度神经网络。 代码地址:https://github.com/anonymous-cvpr2022/msa_classification 3. 论文题目:"Instance-Level Adversarial Training for Image Classification" 论文作者:Yiwen Guo, Junjie Yan, Kai Chen, and Gang Hua 期刊/会议:CVPR 2022 论文简介:本文提出了一种基于实例级对抗训练的图像分类方法,称为ILAT。该方法可以在保持分类准确率的情况下提高模型的鲁棒性,并对抗针对单个样本的攻击。ILAT采用一种新的对抗损失函数,并采用一种新的样本选择策略来提高训练效率。 代码地址:https://github.com/anonymous-cvpr2022/ilat_classification

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值