序列本质

博客探讨了如何计算给定序列中本质不同的子序列数量,包括空序列。通过给出样例输入和输出,解释了如何计算每个位置的子序列个数,并提供了问题的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

给定序列A,求出A中本质不同的子序列(包含空的子序列)个数模109+7的结果.
一个序列B是A的子序列需要满足A删掉某些元素后能够得到B.
两个子序列中对应位置的数都相同我们就认为这两个子序列本质相同.

输入

第一行包含一个整数N,代表序列的长度.接下来一行N个整数,第i个数代表Ai.

输出

输出一个整数代表答案。

样例输入
5
2 3 1 3 2

样例输出

27

刚听了大佬讲解,感觉昨天晚上的2个小时都没a出来实在是……
两个数组分别存:1. 以x为结尾的数的序列个数。 2. 1-i(位置)的子系列的个数
单纯的说没啥意思,直接给组测试实例分析一下吧(以题目样例为例)
-------1 2 3 4 5(位置)
-------2 3 1 3 2(x)
a[x] 1 1+1 3+1 7+1 13+1
b[i] 1 1+2 3+4 7+8-2 27—1
最后还有一个空的序列,so……
代码;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=1e6+10;
const ll mod=1e9+7;
ll a[MAX],b[MAX];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        int x;
        ll sum=0;
        scanf("%d",&x);
        if(i==1)
        {
            a[x]=1;
            b[i]=1;
        }
        else
        {
            if(a[x]!=0)
            {
                sum=a[x];
              
### 序列化的定义与本质 序列化是指将对象的状态信息转换为可以存储或传输的形式的过程。这种形式通常是字节流,可以通过网络进行传输或将数据保存到磁盘中[^1]。通过这种方式,对象可以在不同的环境中被重建并恢复其原始状态。 #### 序列化的本质 序列化的本质在于**对象状态的保存与重建**。它不仅记录了对象的数据成员值,还包含了关于该对象的一些元信息(如类名、字段类型等),从而使得反序列化过程能够正确还原对象及其所属类型的结构[^3]。因此,序列化不仅仅是简单的数据编码,而是涉及到了对象图谱的完整表示。 在 Java 中,当一个对象实现了 `Serializable` 接口时,JVM 就会自动为其提供默认的序列化支持。这个接口本身是一个标记型接口,不包含任何方法声明。它的主要功能是用来表明某个类的对象是可以被序列化的[^5]。 以下是实现序列化的一个简单例子: ```java import java.io.*; class Person implements Serializable { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "Person{name='" + name + "', age=" + age + "}"; } } public class SerializationExample { public static void main(String[] args) throws IOException, ClassNotFoundException { // 创建对象 Person person = new Person("Alice", 25); // 序列化 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) { oos.writeObject(person); } System.out.println("对象已成功序列化"); // 反序列化 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) { Person deserializedPerson = (Person) ois.readObject(); System.out.println("反序列化后的对象:" + deserializedPerson); } } } ``` 在这个示例程序中,`Person` 类实现了 `Serializable` 接口,允许实例对象被写入文件并通过读取文件的方式重新构建出来。 #### 实现原理分析 Java 的序列化机制依赖于 JVM 提供的一套标准协议来进行处理。具体来说,在调用 `writeObject()` 方法时,JVM 首先检查目标对象是否实现了 `Serializable` 或者 `Externalizable` 接口;如果没有,则抛出异常。对于那些符合条件的对象,它们会被分解成一系列属性和关联关系,并按照特定格式打包成二进制流输出[^5]。 另外需要注意的是,某些敏感的信息比如 transient 关键字修饰的变量不会参与序列化进程,因为这些字段被认为不适合长期储存或者是动态计算得出的结果[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值