Origin SuffixArray

不成熟的后缀数组模板:P,还缺ST表、前缀和什么的。
开始试着敲hzwer学长的模板,然而mul函数调用非常慢,滚动也略不方便。
最后还是用了标准的模板,不会拖后腿的模板感觉还好。

#include<set>
#include<ctime>
#include<queue>
#include<cstdio>
#include<bitset>
#include<cctype>
#include<bitset>
#include<cstdlib>
#include<cassert>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf (1<<30)
#define INF (1ll<<62)
#define fi first
#define se second
#define rep(x,s,t) for(register int x=s,t_=t;x<t_;++x)
#define per(x,s,t) for(register int x=t-1,s_=s;x>=s_;--x)
#define prt(x) cout<<#x<<":"<<x<<" "
#define prtn(x) cout<<#x<<":"<<x<<endl
#define pb(x) push_back(x)
#define hash asfmaljkg
#define rank asfjhgskjf
#define y1 asggnja
#define y2 slfvm
using namespace std;
typedef long long ll;
typedef pair<int,int> ii;
template<class T>void sc(T &x){
    int f=1;char c;x=0;
    while(c=getchar(),c<48)if(c=='-')f=-1;
    do x=x*10+(c^48);
    while(c=getchar(),c>47);
    x*=f;
}
template<class T>void nt(T x){
    if(!x)return;
    nt(x/10);
    putchar(x%10+'0');
}
template<class T>void pt(T x){
    if(x<0)putchar('-'),x=-x;
    if(!x)putchar('0');
    else nt(x);
}
template<class T>void ptn(T x){
    pt(x);putchar('\n');
}
template<class T>void pts(T x){
    pt(x);putchar(' ');
}
template<class T>inline void Max(T &x,T y){if(x<y)x=y;}
template<class T>inline void Min(T &x,T y){if(x>y)x=y;}

int n;
const int maxs=200006;
struct Suffix{
    static const int maxs=200006;
    static const int maxc=30;
    int n;
    int sa[maxs],rk[maxs];//adc.
    int h[maxs],s[maxs];//sup.
    int v[maxs];//sort.
    void sapoly(){
        int *a=rk,*b=h;
        rep(i,1,maxc)v[i]=0;
        rep(i,1,n+1)v[s[i]]++;
        rep(i,1,maxc)v[i]+=v[i-1];
        rep(i,1,n+1)sa[v[s[i]]--]=i;
        rep(i,1,n+1)a[sa[i]]=a[sa[i-1]]+(s[sa[i-1]]!=s[sa[i]]);
        a[n+1]=b[n+1]=0;
        for(int p,k=1;k<n;k<<=1){
            p=0;
            rep(i,1,n+1)v[a[sa[i]]]=i;
            rep(i,n-k+1,n+1)b[++p]=i;
            rep(i,1,n+1)if(sa[i]>k)b[++p]=sa[i]-k;
            per(i,1,n+1)sa[v[a[b[i]]]--]=b[i];
            p=0;
            rep(i,1,n+1)b[sa[i]]=(a[sa[i-1]]!=a[sa[i]]||a[sa[i-1]+k]!=a[sa[i]+k])?++p:p;
            swap(a,b);
            if(p==n)break;
        }
        if(a!=rk)memcpy(rk,a,n+1<<2);
    }
    void hipoly(){
        int k=0;
        rep(i,1,n+1){
            for(int j=sa[rk[i]-1];s[j+k]==s[i+k];++k);
            h[rk[i]]=k;if(k)--k;
        }
    }

    void init(char *str,int nn){
        n=nn;
        rep(i,1,n+1)s[i]=str[i]-'a'+1;
        sapoly();
        hipoly();
//      rep(i,1,n+1)mn[0][i]=h[i];
//      rep(i,1,stp[n]+1)
//          rep(j,1,n-(1<<i)+2)
//              mn[i][j]=min(mn[i-1][j],mn[i-1][j+(1<<i-1)]);
    }
    void print(){
        rep(i,1,n)pts(sa[i]);ptn(sa[n]);
        rep(i,2,n)pts(h[i]);if(n>1)ptn(h[n]);
    }
}SA;
char str[maxs];

int main(){
//  freopen("pro.in","r",stdin);
//  freopen("chk.out","w",stdout);
    scanf("%s",str+1);
    n=strlen(str+1);
    SA.init(str,n);
    SA.print();
    return 0;
}
<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2017 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <liu21st@gmail.com> // +---------------------------------------------------------------------- namespace think; use think\db\Query; /** * Class Model * @package think * @mixin Query * @method \think\Model withAttr(array $name,\Closure $closure) 动态定义获取器 */ abstract class Model implements \JsonSerializable, \ArrayAccess { use model\concern\Attribute; use model\concern\RelationShip; use model\concern\ModelEvent; use model\concern\TimeStamp; use model\concern\Conversion; /** * 数据是否存在 * @var bool */ private $exists = false; /** * 是否强制更新所有数据 * @var bool */ private $force = false; /** * 是否Replace * @var bool */ private $replace = false; /** * 更新条件 * @var array */ private $updateWhere; /** * 数据库配置信息 * @var array|string */ protected $connection = []; /** * 数据库查询对象类名 * @var string */ protected $query; /** * 模型名称 * @var string */ protected $name; /** * 数据表名称 * @var string */ protected $table; /** * 写入自动完成定义 * @var array */ protected $auto = []; /** * 新增自动完成定义 * @var array */ protected $insert = []; /** * 更新自动完成定义 * @var array */ protected $update = []; /** * 初始化过的模型. * @var array */ protected static $initialized = []; /** * 是否从主库读取(主从分布式有效) * @var array */ protected static $readMaster; /** * 查询对象实例 * @var Query */ protected $queryInstance; /** * 错误信息 * @var mixed */ protected $error; /** * 软删除字段默认值 * @var mixed */ protected $defaultSoftDelete; /** * 全局查询范围 * @var array */ protected $globalScope = []; /** * 架构函数 * @access public * @param array|object $data 数据 */ public function __construct($data = []) { if (is_object($data)) { $this->data = get_object_vars($data); } else { $this->data = $data; } if ($this->disuse) { // 废弃字段 foreach ((array) $this->disuse as $key) { if (array_key_exists($key, $this->data)) { unset($this->data[$key]); } } } // 记录原始数据 $this->origin = $this->data; $config = Db::getConfig(); if (empty($this->name)) { // 当前模型名 $name = str_replace('\\', '/', static::class); $this->name = basename($name); if (!empty($config['class_suffix'])) { $suffix = basename(dirname($name)); $this->name = substr($this->name, 0, -strlen($suffix)); } } if (is_null($this->autoWriteTimestamp)) { // 自动写入时间戳 $this->autoWriteTimestamp = $config['auto_timestamp']; } if (is_null($this->dateFormat)) { // 设置时间戳格式 $this->dateFormat = $config['datetime_format']; } if (is_null($this->resultSetType)) { $this->resultSetType = $config['resultset_type']; } if (is_null($this->query)) { // 设置查询对象 $this->query = $config['query']; } if (!empty($this->connection) && is_array($this->connection)) { // 设置模型的数据库连接 $this->connection = array_merge($config, $this->connection); } if ($this->observerClass) { // 注册模型观察者 static::observe($this->observerClass); } // 执行初始化操作 $this->initialize(); } /** * 是否从主库读取数据(主从分布有效) * @access public * @param bool $all 是否所有模型有效 * @return $this */ public function readMaster($all = false) { $model = $all ? '*' : static::class; static::$readMaster[$model] = true; return $this; } /** * 创建新的模型实例 * @access public * @param array|object $data 数据 * @param bool $isUpdate 是否为更新 * @param mixed $where 更新条件 * @return Model */ public function newInstance($data = [], $isUpdate = false, $where = null) { return (new static($data))->isUpdate($isUpdate, $where); } /** * 创建模型的查询对象 * @access protected * @return Query */ protected function buildQuery() { // 设置当前模型 确保查询返回模型对象 $class = $this->query; $query = (new $class())->connect($this->connection) ->model($this) ->json($this->json, $this->jsonAssoc) ->setJsonFieldType($this->jsonType); if (isset(static::$readMaster['*']) || isset(static::$readMaster[static::class])) { $query->master(true); } // 设置当前数据表和模型名 if (!empty($this->table)) { $query->table($this->table); } else { $query->name($this->name); } if (!empty($this->pk)) { $query->pk($this->pk); } return $query; } /** * 获取当前模型的数据库查询对象 * @access public * @param Query $query 查询对象实例 * @return $this */ public function setQuery($query) { $this->queryInstance = $query; return $this; } /** * 获取当前模型的数据库查询对象 * @access public * @param bool|array $useBaseQuery 是否调用全局查询范围(或者指定查询范围名称) * @return Query */ public function db($useBaseQuery = true) { if ($this->queryInstance) { return $this->queryInstance; } $query = $this->buildQuery(); // 软删除 if (property_exists($this, 'withTrashed') && !$this->withTrashed) { $this->withNoTrashed($query); } // 全局作用域 if (true === $useBaseQuery && method_exists($this, 'base')) { call_user_func_array([$this, 'base'], [ & $query]); } $globalScope = is_array($useBaseQuery) && $useBaseQuery ? $useBaseQuery : $this->globalScope; if ($globalScope && false !== $useBaseQuery) { $query->scope($globalScope); } // 返回当前模型的数据库查询对象 return $query; } /** * 初始化模型 * @access protected * @return void */ protected function initialize() { if (!isset(static::$initialized[static::class])) { static::$initialized[static::class] = true; static::init(); } } /** * 初始化处理 * @access protected * @return void */ protected static function init() {} /** * 更新是否强制写入数据 而不做比较 * @access public * @param bool $force * @return $this */ public function force($force = true) { $this->force = $force; return $this; } /** * 判断force * @access public * @return bool */ public function isForce() { return $this->force; } /** * 新增数据是否使用Replace * @access public * @param bool $replace * @return $this */ public function replace($replace = true) { $this->replace = $replace; return $this; } /** * 设置数据是否存在 * @access public * @param bool $exists * @return $this */ public function exists($exists) { $this->exists = $exists; return $this; } /** * 判断数据是否存在数据库 * @access public * @return bool */ public function isExists() { return $this->exists; } /** * 数据自动完成 * @access protected * @param array $auto 要自动更新的字段列表 * @return void */ protected function autoCompleteData($auto = []) { foreach ($auto as $field => $value) { if (is_integer($field)) { $field = $value; $value = null; } if (!isset($this->data[$field])) { $default = null; } else { $default = $this->data[$field]; } $this->setAttr($field, !is_null($value) ? $value : $default); } } /** * 保存当前数据对象 * @access public * @param array $data 数据 * @param array $where 更新条件 * @param string $sequence 自增序列名 * @return false */ public function save($data = [], $where = [], $sequence = null) { if (is_string($data)) { $sequence = $data; $data = []; } if (!$this->checkBeforeSave($data, $where)) { return false; } $result = $this->exists ? $this->updateData($where) : $this->insertData($sequence); if (false === $result) { return false; } // 写入回调 $this->trigger('after_write'); // 重新记录原始数据 $this->origin = $this->data; $this->set = []; return true; } /** * 解析查询条件 * @access protected * @param array|null $where 保存条件 * @return array|null */ protected static function parseWhere($where) { if (is_array($where) && key($where) !== 0) { $item = []; foreach ($where as $key => $val) { $item[] = [$key, '=', $val]; } return $item; } return $where; } /** * 写入之前检查数据 * @access protected * @param array $data 数据 * @param array $where 保存条件 * @return bool */ protected function checkBeforeSave($data, $where) { if (!empty($data)) { // 数据对象赋值 foreach ($data as $key => $value) { $this->setAttr($key, $value, $data); } if (!empty($where)) { $this->exists = true; $this->updateWhere = self::parseWhere($where); } } // 数据自动完成 $this->autoCompleteData($this->auto); // 事件回调 if (false === $this->trigger('before_write')) { return false; } return true; } /** * 检查数据是否允许写入 * @access protected * @param array $autoFields 自动完成的字段列表 * @return array */ protected function checkAllowFields($append = []) { // 检测字段 if (empty($this->field) || true === $this->field) { $query = $this->db(false); $table = $this->table ?: $query->getTable(); $this->field = $query->getConnection()->getTableFields($table); $field = $this->field; } else { $field = array_merge($this->field, $append); if ($this->autoWriteTimestamp) { array_push($field, $this->createTime, $this->updateTime); } } if ($this->disuse) { // 废弃字段 $field = array_diff($field, (array) $this->disuse); } return $field; } /** * 保存写入数据 * @access protected * @param array $where 保存条件 * @return int|false */ protected function updateData($where) { // 自动更新 $this->autoCompleteData($this->update); // 事件回调 if (false === $this->trigger('before_update')) { return false; } // 获取有更新的数据 $data = $this->getChangedData(); if (empty($data)) { // 关联更新 if (isset($this->relationWrite)) { $this->autoRelationUpdate(); } return 0; } elseif ($this->autoWriteTimestamp && $this->updateTime && !isset($data[$this->updateTime])) { // 自动写入更新时间 $data[$this->updateTime] = $this->autoWriteTimestamp($this->updateTime); $this->data[$this->updateTime] = $data[$this->updateTime]; } if (empty($where) && !empty($this->updateWhere)) { $where = $this->updateWhere; } // 检查允许字段 $allowFields = $this->checkAllowFields(array_merge($this->auto, $this->update)); // 保留主键数据 foreach ($this->data as $key => $val) { if ($this->isPk($key)) { $data[$key] = $val; } } $pk = $this->getPk(); foreach ((array) $pk as $key) { if (isset($data[$key])) { $array[] = [$key, '=', $data[$key]]; unset($data[$key]); } } if (!empty($array)) { $where = $array; } if ($this->relationWrite) { foreach ($this->relationWrite as $name => $val) { if (is_array($val)) { foreach ($val as $key) { if (isset($data[$key])) { unset($data[$key]); } } } } } $db = $this->db(false); $db->startTrans(); try { // 模型更新 $result = $db->where($where) ->strict(false) ->field($allowFields) ->update($data); // 关联更新 if (isset($this->relationWrite)) { $this->autoRelationUpdate(); } $db->commit(); // 更新回调 $this->trigger('after_update'); return $result; } catch (\Exception $e) { $db->rollback(); throw $e; } } /** * 新增写入数据 * @access protected * @param string $sequence 自增名 * @return int|false */ protected function insertData($sequence) { // 自动写入 $this->autoCompleteData($this->insert); // 时间戳自动写入 $this->checkTimeStampWrite(); if (false === $this->trigger('before_insert')) { return false; } // 检查允许字段 $allowFields = $this->checkAllowFields(array_merge($this->auto, $this->insert)); $db = $this->db(false); $db->startTrans(); try { $result = $db->strict(false) ->field($allowFields) ->insert($this->data, $this->replace, false, $sequence); // 获取自动增长主键 if ($result && $insertId = $db->getLastInsID($sequence)) { $pk = $this->getPk(); foreach ((array) $pk as $key) { if (!isset($this->data[$key]) || '' == $this->data[$key]) { $this->data[$key] = $insertId; } } } // 关联写入 if (isset($this->relationWrite)) { $this->autoRelationInsert(); } $db->commit(); // 标记为更新 $this->exists = true; // 新增回调 $this->trigger('after_insert'); return $result; } catch (\Exception $e) { $db->rollback(); throw $e; } } /** * 字段值(延迟)增长 * @access public * @param string $field 字段名 * @param integer $step 增长值 * @param integer $lazyTime 延时时间(s) * @return integer|true * @throws Exception */ public function setInc($field, $step = 1, $lazyTime = 0) { // 读取更新条件 $where = $this->getWhere(); $result = $this->db(false)->where($where)->setInc($field, $step, $lazyTime); if (true !== $result) { $this->data[$field] += $step; } return $result; } /** * 字段值(延迟)增长 * @access public * @param string $field 字段名 * @param integer $step 增长值 * @param integer $lazyTime 延时时间(s) * @return integer|true * @throws Exception */ public function setDec($field, $step = 1, $lazyTime = 0) { // 读取更新条件 $where = $this->getWhere(); $result = $this->db(false)->where($where)->setDec($field, $step, $lazyTime); if (true !== $result) { $this->data[$field] -= $step; } return $result; } /** * 获取当前的更新条件 * @access protected * @return mixed */ protected function getWhere() { // 删除条件 $pk = $this->getPk(); if (is_string($pk) && isset($this->data[$pk])) { $where[] = [$pk, '=', $this->data[$pk]]; } elseif (!empty($this->updateWhere)) { $where = $this->updateWhere; } else { $where = null; } return $where; } /** * 保存多个数据到当前数据对象 * @access public * @param array $dataSet 数据 * @param boolean $replace 是否自动识别更新和写入 * @return Collection|false * @throws \Exception */ public function saveAll($dataSet, $replace = true) { $result = []; $db = $this->db(false); $db->startTrans(); try { $pk = $this->getPk(); if (is_string($pk) && $replace) { $auto = true; } foreach ($dataSet as $key => $data) { if (!empty($auto) && isset($data[$pk])) { $result[$key] = self::update($data, [], $this->field); } else { $result[$key] = self::create($data, $this->field, $this->replace); } } $db->commit(); return $this->toCollection($result); } catch (\Exception $e) { $db->rollback(); throw $e; } } /** * 是否为更新数据 * @access public * @param mixed $update * @param mixed $where * @return $this */ public function isUpdate($update = true, $where = null) { if (is_bool($update)) { $this->exists = $update; if (!empty($where)) { $this->updateWhere = $where; } } else { $this->exists = true; $this->updateWhere = $update; } return $this; } /** * 删除当前的记录 * @access public * @return bool */ public function delete() { if (!$this->exists || false === $this->trigger('before_delete')) { return false; } // 读取更新条件 $where = $this->getWhere(); $db = $this->db(false); $db->startTrans(); try { // 删除当前模型数据 $db->where($where)->delete(); // 关联删除 if (!empty($this->relationWrite)) { $this->autoRelationDelete(); } $db->commit(); $this->trigger('after_delete'); $this->exists = false; return true; } catch (\Exception $e) { $db->rollback(); throw $e; } } /** * 设置自动完成的字段( 规则通过修改器定义) * @access public * @param array $fields 需要自动完成的字段 * @return $this */ public function auto($fields) { $this->auto = $fields; return $this; } /** * 写入数据 * @access public * @param array $data 数据数组 * @param array|true $field 允许字段 * @param bool $replace 使用Replace * @return static */ public static function create($data = [], $field = null, $replace = false) { $model = new static(); if (!empty($field)) { $model->allowField($field); } $model->isUpdate(false)->replace($replace)->save($data, []); return $model; } /** * 更新数据 * @access public * @param array $data 数据数组 * @param array $where 更新条件 * @param array|true $field 允许字段 * @return $this */ public static function update($data = [], $where = [], $field = null) { $model = new static(); if (!empty($field)) { $model->allowField($field); } $result = $model->isUpdate(true)->save($data, $where); return $model; } /** * 删除记录 * @access public * @param mixed $data 主键列表 支持闭包查询条件 * @return bool */ public static function destroy($data) { $model = new static(); $query = $model->db(); if (empty($data) && 0 !== $data) { return false; } elseif (is_array($data) && key($data) !== 0) { $query->where(self::parseWhere($data)); $data = null; } elseif ($data instanceof \Closure) { $data($query); $data = null; } $resultSet = $query->select($data); if ($resultSet) { foreach ($resultSet as $data) { $data->delete(); } } return true; } /** * 获取错误信息 * @access public * @return mixed */ public function getError() { return $this->error; } /** * 解序列化后处理 */ public function __wakeup() { $this->initialize(); } public function __debugInfo() { return [ 'data' => $this->data, 'relation' => $this->relation, ]; } /** * 修改器 设置数据对象的值 * @access public * @param string $name 名称 * @param mixed $value 值 * @return void */ public function __set($name, $value) { $this->setAttr($name, $value); } /** * 获取器 获取数据对象的值 * @access public * @param string $name 名称 * @return mixed */ public function __get($name) { return $this->getAttr($name); } /** * 检测数据对象的值 * @access public * @param string $name 名称 * @return boolean */ public function __isset($name) { try { return !is_null($this->getAttr($name)); } catch (InvalidArgumentException $e) { return false; } } /** * 销毁数据对象的值 * @access public * @param string $name 名称 * @return void */ public function __unset($name) { unset($this->data[$name], $this->relation[$name]); } // ArrayAccess public function offsetSet($name, $value) { $this->setAttr($name, $value); } public function offsetExists($name) { return $this->__isset($name); } public function offsetUnset($name) { $this->__unset($name); } public function offsetGet($name) { return $this->getAttr($name); } /** * 设置是否使用全局查询范围 * @param bool|array $use 是否启用全局查询范围(或者用数组指定查询范围名称) * @access public * @return Query */ public static function useGlobalScope($use) { $model = new static(); return $model->db($use); } public function __call($method, $args) { if ('withattr' == strtolower($method)) { return call_user_func_array([$this, 'withAttribute'], $args); } return call_user_func_array([$this->db(), $method], $args); } public static function __callStatic($method, $args) { $model = new static(); return call_user_func_array([$model->db(), $method], $args); } }
最新发布
09-11
### Model类的整体功能概述 在ThinkPHP框架中,`Model` 类是数据模型的基础类,主要用于与数据库进行交互,封装了数据的增删改查等操作,同时支持数据验证、关联查询、事件处理等功能。从提供的代码片段可以看出,`Model` 类实现了 `\JsonSerializable` 和 `\ArrayAccess` 接口,这使得模型对象可以方便地进行 JSON 序列化和像数组一样访问属性。 ### 代码功能和实现逻辑分析 #### 1. 接口实现 ```php abstract class Model implements \JsonSerializable, \ArrayAccess { // ... } ``` - `\JsonSerializable` 接口:实现该接口需要定义 `jsonSerialize` 方法,允许对象在进行 `json_encode` 操作时自定义序列化的结果。这在将模型对象转换为 JSON 数据时非常有用,例如在 API 开发中返回数据给客户端。 - `\ArrayAccess` 接口:实现该接口需要定义 `offsetExists`、`offsetGet`、`offsetSet` 和 `offsetUnset` 方法,使得模型对象可以像数组一样访问和操作属性。例如,可以使用 `$model['attribute']` 来访问或设置模型的属性。 #### 2. Trait 的使用 ```php use model\concern\Attribute; use model\concern\RelationShip; use model\concern\ModelEvent; use model\concern\TimeStamp; use model\concern\Conversion; ``` - `Attribute`:通常用于处理模型属性的访问和修改,可能包含属性的获取器和修改器,以及属性的默认值设置等功能。 - `RelationShip`:用于处理模型之间的关联关系,如一对一、一对多、多对多等关联查询。 - `ModelEvent`:用于处理模型的事件,如创建、更新、删除等事件的监听和处理。 - `TimeStamp`:用于自动处理模型的时间戳字段,如 `created_at` 和 `updated_at` 字段的自动更新。 - `Conversion`:可能用于处理模型属性的类型转换,例如将数据库中的日期时间字段转换为 PHP 的 `DateTime` 对象。 #### 3. 属性和方法 ```php /** * 是否存在数据 * @var bool ``` 这是一个注释,表明该模型类可能有一个布尔类型的属性用于表示是否存在数据,但代码片段中未给出具体的属性定义。 ```php class Model extends Make { protected $type = "Model"; protected function configure() { parent::configure(); $this->setName('make:model') ->setDescription('Create a new model class'); } } ``` - `$type` 属性:用于标识该模型的类型,这里设置为 `"Model"`。 - `configure` 方法:继承自 `Make` 类,用于配置模型的创建命令。通过调用 `parent::configure()` 调用父类的配置方法,然后设置命令的名称和描述,用于创建新的模型类。 ### 总结 ThinkPHP 的 `Model` 类通过接口实现、Trait 的使用和属性方法的定义,提供了丰富的数据操作和处理功能,使得开发者可以方便地进行数据库交互和业务逻辑的实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值