算法——贡献法

news/2024/9/19 22:12:54 标签: 算法

前天的AtCoder Beginner Contest 371 D题碰到了这个贡献法,刚好之前的第十一届蓝桥杯省赛第二场真题AcWing 2868. 子串分值也是用的这个方法hh,但是赛时没有搞出来。。。

AcWing 2868. 子串分值

对于一个字符串 SS,我们定义 SS 的分值 f(S)f(S) 为 SS 中恰好出现一次的字符个数。

例如 f(“aba”)=1f(“aba”)=1,f(“abc”)=3f(“abc”)=3, f(“aaa”)=0f(“aaa”)=0。

现在给定一个字符串 S[0…n−1]S[0…n−1](长度为 nn),请你计算对于所有 SS 的非空子串 S[i…j](0≤i≤j<n)S[i…j](0≤i≤j<n), f(S[i…j])f(S[i…j]) 的和是多少。

输入格式

输入一行包含一个由小写字母组成的字符串 SS。

输出格式

输出一个整数表示答案。

数据范围

对于 20%20% 的评测用例,1≤n≤101≤n≤10;
对于 40%40% 的评测用例,1≤n≤1001≤n≤100;
对于 50%50% 的评测用例,1≤n≤10001≤n≤1000;
对于 60%60% 的评测用例,1≤n≤100001≤n≤10000;
对于所有评测用例,1≤n≤1000001≤n≤100000。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int l[N],r[N],p[26];
char str[N];
typedef long long ll;
int main(){
    cin>>str+1;
    int n=strlen(str+1);
    for(int i=1;i<=n;i++){
        int t=str[i]-'a';
        l[i]=p[t];
        p[t]=i;
    }
    for(int i=0;i<26;i++)p[i]=n+1;
    for(int i=n;i;i--){
        int t=str[i]-'a';
        r[i]=p[t];
        p[t]=i;
    }
    ll res=0;
    for(int i=1;i<=n;i++){
        res+=(ll)(i-l[i])*(r[i]-i);
    }
    cout<<res;
    return 0;
}

 这道题里面一个字符只有恰好出现一次才贡献为1,出现了多次就贡献为0;

所以,只有在L[i]~~R[i]区间内贡献1,超过了就贡献0;

然后,乘法原理得res+=(ll)(i-l[i])*(r[i]-i);。。。记得加(ll)强制类型转换。

p[]的作用是临时数组。

AtCoder Beginner Contest 371 D题

E - I Hate Sigma Problems (atcoder.jp)

Problem Statement

You are given a sequence of integers A=(A1,A2,…,AN)A=(A1​,A2​,…,AN​) of length NN. Define f(l,r)f(l,r) as:

  • the number of distinct values in the subsequence (Al,Al+1,…,Ar)(Al​,Al+1​,…,Ar​).

Evaluate the following expression:

∑i=1N∑j=iNf(i,j)i=1∑N​j=i∑N​f(i,j).

Constraints

  • 1≤N≤2×1051≤N≤2×105
  • 1≤Ai≤N1≤Ai​≤N
  • All input values are integers.

Input

The input is given from Standard Input in the following format:

NN
A1A1​ …… ANAN​

Output

Print the answer.

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int a[N],r[N],p[N];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)p[i]=n+1;
    for(int i=n;i;i--){
        int t=a[i];
        r[i]=p[t];
        p[t]=i;
    }
    ll  res=0;
    for(int i=1;i<=n;i++)
    {
        res+=(ll)(i-0)*(r[i]-i);
    }
    // for(int i=1;i<=n;i++){//用左端点的写法
    //     int t=a[i];
    //     l[i]=p[t];
    //     p[t]=i;
    // }
    // ll res=0;
    // for(int i=1;i<=n;i++){
    //     res+=(ll)(i-l[i])*(n-i+1);
    // }
    cout<<res;
    return 0;
}

记得开long long 否则过不了 


http://www.niftyadmin.cn/n/5666210.html

相关文章

Linux服务器上下左右键乱码^[[D ^[[C ^[[A ^[[B

查看shell环境&#xff1a; echo $SHELL如果出现 bin/sh&#xff0c; 那么输入&#xff1a; bash学术会议征稿 想要了解国内主办的覆盖学科最全最广的学术会议&#xff0c;请前往【会议官网】&#xff1a; 学术会议官网www.ais.cn

01_快速入门

读取数据 import pandas as pd# df pd.read_excel(https://xxxx/xxx//xx.xslx) # 读取网络数据 # df pd.read_excel(rd:\data\xx.xslx) # 读取本地文件 # 如果是csv文件&#xff0c;用read_csv()函数 df pd.read_csv(seaborn/iris.csv)查看数据 df.head() # 前5条记录 d…

MiniDB 使用手册

MiniDB 使用手册 核心功能指南表的创建与管理数据操作事务管理 本使用文档旨在帮助用户快速上手使用本数据库系统。 进行数据库操作之间必须输入init命令进行初始化 核心功能指南 表的创建与管理 CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR …

【Elasticsearch系列七】索引 crud

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

数据库基础知识---------------------------(2)

MYSQL的存储过程 就是数据库 SQL 语言层面的代码封装与重用 语法格式 delimiter 自定义结束符号 create procedure 存储名({in,out,inout} 参数名,数据类型...) begin sql 语句 end 自定义结束符 delimiter; 变量定义 局部变量 用户自定义 仅在begin / end 块中有效 当将查询…

对 JavaScript 原型的理解

笔者看了一些有关 JavaScript 原型的文章有感而发&#xff0c;就将所感所悟画了下来如果有理解错误和不足的地方&#xff0c;欢迎各位大佬指出&#xff0c;笔者感激不尽

Transformer 架构详解

Transformer 架构是由 Ashish Vaswani 和他的同事们在 2017 年的论文《Attention is All You Need》中首次提出的。它在自然语言处理(NLP)和其他序列建模任务中取得了前所未有的成功。Transformer 模型完全基于自注意力机制,摒弃了循环和卷积操作,这使得它在处理长序列数据…

C++20 模块化(Modules)

C20 引入的模块化&#xff08;Modules&#xff09;是一个重大改进&#xff0c;旨在取代传统的头文件机制&#xff0c;提高编译速度、代码可维护性以及项目的可扩展性。模块化为 C 提供了一种更现代化的代码组织方式&#xff0c;避免了头文件中常见的宏污染、重复编译和复杂的依…