(模板)KMP算法

【算法模板】KMP算法 简述 KMP算法:由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,串匹配算法,一般串都是指字符串。KMP是基于双指针算法的 应用:一个字符串在另外一个字符串中出现的位置和 循环节 一般地,被匹配的字符串叫主串,用来匹配主串的叫模式串 如果我们不用KMP,来查找一个字符串在另外一个字符串中第一次出现的位置,暴力求解时间复杂度是O(NM),用KMP优化查询时间复杂度是O(1),但是空间复杂度是O(N)。M和N分别是模式串和字串的大小。 KMP讲解 我觉得MOOC浙江大学数据结构讲的很不错, 阅读详情

写了几种版本,首先是string版的。string大法吼哇!!!
这里的next1[i]指的是在0~i-1构成的字符串中有多大长度的相同前缀后缀,同时也是模式串str2[i]匹配失败后跳转到的位置。同时值得注意的是这里的字符串是从0开始的

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int next1[1000005];
void getnext(string str)
{
    next1[0]=-1;
    int k=-1,j=0;
    while(j<str.size()-1){
        if(k==-1||str[k]==str[j]){
            k++;j++;
            next1[j]=k;
        }
        else{
            k=next1[k];
        }
    }
}
int main()
{
    string str1,str2;
    cin>>str1>>str2;
    getnext(str2);
    int i=0,j=0;
    while(i<str1.size()){//因为是输出s1中所有s2的位置所以while里只对s1的长度做出限制
        if(j==-1||str1[i]==str2[j]){
            if(j==str2.size()-1){//判断一定要放在这里,否则i++,j++会导致重叠部分无法利用,比如ABABABAB和ABAB的匹配
                cout<<i-str2.size()+1<<endl;
                j=next1[j];continue;
            }
            i++;j++;
        }
        else{
            while(j>=0&&str2[j]!=str1[i])//这里注意要加等于号
                j=next1[j];
        }
    }
//    if(j==str2.size()){
//
//    }
    for(i=0;i<str2.size();i++)
        cout<<next1[i]<<' ';

    return 0;
}

字符串从1开始的版本,By Poeroz

// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1000005;
int n,m,j,cnt;
char A[N],B[N];
int next1[N];
int main()
{
    scanf("%s%s",A+1,B+1);
    n=strlen(A+1);m=strlen(B+1);
    next1[1]=0;j=0;
    for(int i=2;i<=m;i++){
        while(j&&B[j+1]!=B[i])j=next1[j];
        if(B[j+1]==B[i])j++;//避免j=0的情况
        next1[i]=j;
    }
    j=0;
    for(int i=1;i<=n;i++){
        while(j&&B[j+1]!=A[i])j=next1[j];
        if(B[j+1]==A[i])j++;
        if(j==m){
            cout<<i-m+1<<endl;
            cnt++;j=next1[j];
        }
    }
    //cout<<cnt<<endl;
    for(int i=1;i<=m;i++)
        cout<<next1[i]<<' ';

    return 0;
}
算法学习之KMP(模板整理) 犹记当年学习C语言的字符串的时候那个悲情。。。 于是组队之后果断声明:鶸不玩字符串 然后将字符串丢给队友。。。 后来觉得吧,一些基础的东西还是要会的,比如KMP 粗浅的学了下KMP算法,也不敢瞎说什么,主要整理了下模板 学习记录: 主要看了刘大大的蓝书《算法竞赛入门经典--训练指南》 还有几篇博客:                            1. KMP算法详解 阅读详情

相关推荐

[金仓数据库V8R6]更换授权

上传授权,使用mv license_xxx_0.dat /home/kingbase/KingbaseES/license.dat替换每个授权,并使用ls -l license.dat确保替换前后属主和权限不变。根据步骤1的数据目录位置,执行/home/kingbase/KingbaseES/Server/bin/sys_ctl -D /home/kingbase/KingbaseES/data reload使新的授权文件生效。该参数意义为授权剩余有效天数,查询结果为新授权中有效期间的天数即为替换成功。

l04050924的博客 3708

KMP算法模板

例题 SDUT OJ 数据结构实验之串一:KMP应用 #include <iostream> #include <cstdio> #include <cstdlib> #include <string.h> #include <algorithm> using namespace std; const int N = 11234567; int n,m; int Next[N]; int a[N],b[N]; void get_next(in

qq_45728527的博客 185

BMW Standard Tools 宝马FSC工具套装下载

这是一款非常专业的一套宝马编码工具,懂行的人自然知道他的用处,不懂行的人,我解释再多也不会明白的,需要的拿去吧。软件名:BMW Standard Tools包含工具:BMW Coding Tool v2.50、change Language、CIC Mafia、Dr.Gini B021、EasyConnect、EDIABAS Konfigurator v1.1、EDIABAS Konfigurator v2.0.0、FSC-Tools_2.18、FSTool_v2_CarServer、INPA、ITool

Zj_arrow的博客 6998

算法修炼之筑基篇——筑基一层后期(解决KMP算法,KMP算法模板)

算法修炼之筑基篇——筑基一层后期(解决KMP算法,KMP算法模板)

VLOKL的博客 443

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(含XML配置详解)

本文详细介绍了如何使用SSC Tool 5.13为先楫HPM6E00EVK开发板配置8轴EtherCAT从站,包括XML文件深度配置、代码生成与工程整合、烧录与调试技巧。教程涵盖从环境准备到性能优化的全流程,帮助开发者快速实现符合CIA402标准的8轴控制。

weixin_30352645的博客 255

1.3、云计算HCIP融合存储产品及部署

目标:描述Oceanstor V3系列存储产品系统组成及产品定位 描述Oceanstor V3硬件结构及软件架构 掌握存储系统与主机系统之间的连接 一、存储型号 低端型存储:Oceanstor 2200 2600 2800 V3/V5 终端型存储:Oceanstor 5300 5500 5600 5800 6800 V3/V5 高端型存储:Oceanstor 18000 二、Oceanstor V3系列存储系统定位 OceanStor V3系列存储系统是华为根据存储产品应用现状和存储

weixin_43666279的博客 1653

kmp算法模板

#include<iostream> #include<vector> #include<queue> using namespace std; /* next数组的含义 初始化: next[0] = -1; next[i]:当当前位置不匹配时,需要回溯的位置 如模板串 ababa next[] = {-1, 0, 0, 1, 2, 3} //最后一个位置next[5]=3 代表全部匹配需要回溯的位置,即前面有3个字符是重复的。 可以看出next[i]其实也是当前下标

qq_40181728的博客 288

【Android14 ShellTransitions】Transition就绪:双Transaction与SurfaceControl显示时机剖析

本文深入剖析了Android14 ShellTransitions框架中Transition就绪阶段的核心机制。重点解释了为何需要“双Transaction”来精确控制SurfaceControl的显示与隐藏时机,以确保Activity切换动画的流畅性。通过分析onTransactionReady流程、窗口绘制状态机及动画目标提升策略,揭示了系统如何协调WMCore与WMShell,实现从状态收集到动画播放的无缝衔接。

ooo22的博客 529

好记忆的KMP算法模板

介绍了一种好记得的KMP模板,并给出难点部分的解答,还比较了求next和匹配两个部分之间的异同点辅助记忆。

Kent的博客 342

ABAP CDS View 从入门到精通教程第一篇:ABAP CDS View 在 SAP 技术体系中的重要地位

摘要:本文介绍了SAP开发技术专家提供的多套SAP开发教程,涵盖ABAP、UI5、Fiori、OData、BTP等技术领域。重点阐述了ABAP CDS View在SAP S/4HANA中的核心地位,作为虚拟数据模型(VDM)的关键技术,它实现了OLTP和OLAP的统一处理。文章还说明了学习CDS View的前置条件,包括需要SAP NetWeaver 7.50 SP01或更高版本系统,以及使用SAP ABAP Development Tool进行开发实践。作者具有16年SAP开发经验,这些教程形成了完整的S

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 897

【数据集】全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

全球大气空气柱平均甲烷(XCH₄)和一氧化碳(XCO)浓度数据集 TROPOMI/WFMD

WW、forever的博客 387

KMP算法总结与模板

发现学了好久了KMP了,模板却总是背不会,感觉自己还是没有理解深刻。。。。。。 求解的基本问题 给定一个模式串S长度为m,和模板串P长度为n,求解模板串P在模式串S中出现的位置 解决方法 模板串P需要同模式串S匹配很多次,当一个字符匹配失效时,传统的算法往往模板串P会整个从头开始,导致算法的时间复杂度是O(m∗n)O(m*n)O(m∗n), ...

xiongyuqing的博客 260

【华为OD机试真题E卷】514、学生方阵 | 机试真题+思路参考+代码分析(E卷复用)(C++、Java、Py)

【华为OD机试真题E卷】514、学生方阵 | 机试真题+思路参考+代码分析(E卷复用)(C++、Java、Py) 题目描述 学校组织活动,将学生排成一个矩形方阵 请在矩形方阵中找到最大的位置相连的男生数量 这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的 注:学生个数不会超过10000

KJ.JK 2492

KMP详细解释及KMP算法模板

KMP是什么,KMP解决什么类型的问题 KMP全称为Knuth Morris Pratt算法,是一种高效的字符串匹配算法,寻找一个字符串中是否包含另一个字符串,例如 char *s = "ababababcab"; char *p = "ababc"; s为模板串(主串),p为字串,在s中找到p的位置 ...

zhbbbbbb的博客 3293

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数据结构——KMP算法及改进算法模板(C语言)

前言 本篇博客主要是给出KMP算法的模板,所适应的读者都是接触过数据结构中KMP算法的人,并对其有了解,当然,如果你是初学者,你可以收藏起来,等自己真正需要时,可以拿来看看。当然,如果有写的不好的地方,希望大家指正。好了,不多说,直接上代码。 代码 //KMP算法代码模板 //获取next数组 int get_next(char T,int *next){ int i,j; i=1; j=0; next[i]=0; while(i<T[0]){

weixin_45637300的博客 484

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java版KMP算法模板

构建部分匹配表(PMT),这是KMP算法的核心预处理步骤pmt[i]表示pattern[0...i]的最长公共前后缀长度时间复杂度:O(m),m为模式串长度:执行KMP搜索算法利用构建好的部分匹配表在文本中高效搜索模式串时间复杂度:O(n+m),n为文本长度文本:"ABABDABACDABABCABAB"模式串:"ABABCABAB"输出结果为模式串在文本中的起始位置和匹配部分。

2301_81193552的博客 730

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

hdu 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置开始完全匹配的? kmp裸题,复杂度O(n+m)。 当一个字符串以0为起始下标时,next[i]可以描述为"不为自身的最大首尾重复子串长度"。 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 并且next[j]恰好等于这个最大长度。 防止超时,注意一些细节。。 另外:尽量少用str

NK_test的博客 2642

字符串匹配KMP算法Java模板(可直接使用)

KMP算法不做过多介绍,想要了解的同学可以自行学习。这里给出一个可以直接使用的Java模板,代码如下: public class SubstringSearch { //构建失配数组 private int[] computeTemporaryArray(char pattern[]){ int [] lps = new int[pattern.length]; int j =0; for(int i=1; i < pattern.len

乔卿的博客 809

算法刷题【洛谷P3375】【模板】KMP字符串匹配(KMP算法模板 超详细易懂讲解)

给出两个字符串 s_1s 1 ​ 和 s_2s 2 ​ ,若 s_1s 1 ​ 的区间 [l, r][l,r] 子串与 s_2s 2 ​ 完全相同,则称 s_2s 2 ​ 在 s_1s 1 ​ 中出现了,其出现位置为 ll。 现在请你求出 s_2s 2 ​ 在 s_1s 1 ​ 中所有出现的位置。 定义一个字符串 ss 的 border 为 ss 的一个非 ss 本身的子串 tt,满足 tt 既是 ss 的前缀,又是 ss 的后缀。 对于 s_2s 2 ​

异想之旅的博客 1106

算法模板 KMP算法

算法模板 KMP算法KMP 简介KMP解释KMP算法结束 KMP 简介 百度百科: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n) KMP解释 全有注释,别问,问就是模板,具体看算法

qq_45787905的博客 405

KMP算法模板(草解)

在长度为N的字符串中匹配长度为m的字符串,KMP算法是在任何的字符串中匹配中时间复杂度都是O(m+n),不会出现极致的情况O(n*m) 简单得讲他就是先对字符串N进行预处理,从而在与字符串M匹配时跳过一些字符串,从而达到快速匹配的目的 他是怎么实现的呢? 假设指针i指向字符串N,j指向字符串M的位置,在使用KMP算法时,指向N的i指针是不会回溯的,而是一直往后面走,大大减少了时间复杂度,-------KMP的核心就是Next[]数组的使用,,当出现失配后,当进行下一次匹配时,用Next[]指出j回溯的位置

qq_45595985的博客 246

算法模板——KMP字符串匹配

功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单模板大量匹配待匹配串时,这个会有相当大的优势,AC自动机虽然好想一些,但是在这一类问题上的性价比就略低了 1 var 2 i,j,k,l,m,n:longint; 3...

190
上一篇: 洛谷P1160
下一篇: 链表test
HumveeA6
博客等级 码龄17年 12粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值