最新要闻
- 观速讯丨北京安监局特种作业证查询_安监局特种作业证查询
- 吃水果为什么可以解酒?苹果葡萄等五种水果最佳
- 滚动:自动驾驶数据遭破坏时 工信部:应能识别记录
- iPhone 14 Pro Max用户换上Redmi Note 12 Turbo 1T版:花2000多很值
- 比亚迪的刀片 终于“捅向”特斯拉|天天最资讯
- 半年亏7千万 老板想跳楼!新能源造富运动结束了_环球新资讯
- 关于雷的成语_关于一的成语_天天滚动
- 【天天时快讯】这座“中国建造”让洪都拉斯人有了更多期盼
- 曝光收车、卖车“套路” 博主被人人车发删稿函
- 天天速递!死磕影像!曝小米14系列将搭载独家WLG高透镜片
- 干翻Java/C++!Python成最受开发者欢迎编程语言:岗位报酬高居第一_环球快消息
- 热点在线丨山东71岁爷爷一年2次外出卖止咳蜂蜜糖:一待就是一两个月
- 当前信息:92岁巴菲特还没有退休计划:曾直言身体“不能再好了”
- 教育部:开展校外培训“平安消费”专项行动
- 中梁控股2023年1-4月累计交付房屋22399套
- 世界资讯:对标千元级耳机!真我Buds Air5 Pro无线耳机官宣
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
「学习笔记」AC 自动机
「学习笔记」AC 自动机
点击查看目录
目录
- 「学习笔记」AC 自动机
- 算法
- 问题
- 思路
- 代码
- 例题
- Keywords Search
- 玄武密码
- 单词
- 病毒
- 最短母串
- 文本生成器
- 背单词
- 密码
- 禁忌
前置:「学习笔记」字符串基础:Hash,KMP与Trie。
好像对例题的讲解越来越抽象了?
算法
问题
求 \(n\) 个单词在一个长度为 \(m\) 的文章里出现过多少个。
(相关资料图)
思路
很多文章都说这玩意是 Trie 树 + KMP,我觉得确实可以这样理解但是不完全一样。
KMP 有两种理解方式:求 Border 或失配指针,AC 自动机用的是「失配指针」这个理解方式。
KMP 的失配指针指向的是一个最长的与后缀一样的前缀,这样仍然可以继续匹配,而且使需要重新匹配的地方尽量短。
AC 自动机 \(\text{fail}\) 指针指向的则是一个存在于这个 Trie 树中的最长的与真后缀相同的字符串。
依旧是拿 OI-wiki 的图举个例子:
比如单词 she
,它的真后缀有 he
,e
和 (\(\leftarrow\) 这个真后缀是空的),其中 he
和 存在于 Trie 树中,则让 \(9\) 号节点的 \(\text{fail}\) 指针指向最长的 he
的末尾节点 \(2\) 号节点。
再如单词 her
,它的真后缀有 er
,r
和 ,但是只有 存在于 Trie 树中,则让 \(3\) 号节点的 \(\text{fail}\) 指针指向根节点 \(0\)。
那么怎么找到 \(\text{fail}\) 指针呢?
我们设当前节点 \(p\) 代表的字符是 \(c\),则 \(p\) 的 \(\text{fail}\) 指针应指向 \(p\) 的父亲的 \(\text{fail}\) 指针的代表 \(c\) 的儿子。
例如上图中,\(9\) 代表的字符是 e
,\(9\) 的父亲是 \(8\),\(8\) 的 \(\text{fail}\) 指针指向 \(1\),\(1\) 的代表 e
的儿子是 \(2\),因此 \(9\) 的 \(\text{fail}\) 指针指向 \(2\) 号节点。
很好理解吧!xrlong said:没看出来。
但是有个问题,比如图中的六号节点应指向哪里?\(6\) 的父亲 \(5\) 的 \(\text{fail}\) 指针 \(10\) 的代表 s
的儿子不存在,但是很明显应指向 \(7\) 啊!
那就跳到 \(10\) 号节点的 \(\text{fail}\) 指针 \(0\),找 \(0\) 的代表 s
的儿子 \(7\)。但是每次跳很多 \(\text{fail}\) 指针效率太低了,怎么办?
那就魔改一下这棵树!如果 \(p\) 不存在代表 \(c\) 的儿子,那就让 \(p\) 代表 \(c\) 的儿子指向 \(p\) 的 \(\text{fail}\) 指针的代表 \(c\) 的儿子。
就像下面这幅图:
最后再次放一下 OI-wiki 上的完整动图:
- 蓝色结点:BFS 遍历到的结点 \(u\)。
- 蓝色的边:当前结点下,AC 自动机修改字典树结构连出的边。
- 黑色的边:AC 自动机修改字典树结构连出的边。
- 红色的边:当前结点求出的 \(\text{fail}\) 指针。
- 黄色的边:\(\text{fail}\) 指针。
- 灰色的边:字典树的边。
代码
namespace ACAUTOMATON {class ACAutomaton {private:ll cnt = 0, nxt[N][26], fail[N], end[N];public:inline void Clear () {cnt = 0;memset (nxt, 0, sizeof (nxt));memset (end, 0, sizeof (end));memset (fail, 0, sizeof (fail));return;}inline void Insert (char* s) {ll p = 0, len = strlen (s + 1);_for (i, 1, len) {ll c = s[i] - "a";if (!nxt[p][c]) nxt[p][c] = ++cnt;p = nxt[p][c];}++end[p];return;}inline void Build () {std::queue q;_for (i, 0, 25) if (nxt[0][i]) fail[nxt[0][i]] = 0, q.push (nxt[0][i]);while (!q.empty ()) {ll u = q.front (); q.pop ();_for (i, 0, 25) {if (nxt[u][i]) fail[nxt[u][i]] = nxt[fail[u]][i], q.push (nxt[u][i]);else nxt[u][i] = nxt[fail[u]][i];}}return;}inline ll Query (char* s) {ll now = 0, len = strlen (s + 1), ans = 0;_for (i, 1, len) {now = nxt[now][s[i] - "a"];for (ll p = now; p && ~end[p]; p = fail[p]) ans += end[p], end[p] = -1;}return ans;}};}
例题
Keywords Search
板子题。
玄武密码
在每个单词结尾的节点往前跑,看哪个节点深度最高且被访问过。
单词
记录每个点被访问过多少次,但直接记录时间会爆炸。
可以考虑延迟下传访问次数。
病毒
在 trie 树上找一个包括根节点的环,能找到的话直接顺着这个环不断跑就可以构造出无限长的安全代码。
最短母串
用哈希可以随便杀啊!但是这是 AC 自动机题单,所以我要用 AC 自动机写 DP(悲
\(f_{u, sta}\) 表示到节点 \(u\) 时,已经经过的字符串状态为 \(sta\) 时的最短字符串。
然后不难发现直接暴力广搜转移即可。
文本生成器
\(f_{u, l, b}\) 表示到节点 \(u\) 时,已经经过 \(l\) 个字符,「是否已经出现过给定串」的答案为 \(b(b\in\{0, 1\})\) 时的可读文本数量。
直接暴力广搜转移即可。
背单词
首先建出整个 AC 自动机,然后查询每个字符串的答案。
查询的过程有点说不太清,直接看码罢。
注意每次查询时把经过的节点标记一下,只能从标记过的节点转移。
为啥要用线段树啊。
貌似没人有我这个方法?那贴一份代码:
点击查看代码
const ll N = 3e5 + 10;namespace ACAUTOMATON {class ACAutomaton {public:ll cnt = 0, nxt[N][26], jl[N], fail[N], f[N];public:inline void Clear () {_for (i, 0, cnt) {memset (nxt[i], 0, sizeof (nxt[i]));fail[i] = f[i] = jl[i] = 0;}cnt = 0;return;}inline void Insert (std::string s) {ll p = 0, len = s.length () - 1;_for (i, 0, len) {ll c = s[i] - "a";if (!nxt[p][c]) nxt[p][c] = ++cnt;p = nxt[p][c];}return;}inline void Build () {std::queue q;_for (i, 0, 25) if (nxt[0][i]) fail[nxt[0][i]] = 0, q.push (nxt[0][i]);while (!q.empty ()) {ll u = q.front (); q.pop ();_for (i, 0, 25) {if (nxt[u][i]) fail[nxt[u][i]] = nxt[fail[u]][i], q.push (nxt[u][i]);else nxt[u][i] = nxt[fail[u]][i];}}return;}inline ll GetAns (std::string s, ll w) {ll p = 0, len = s.length () - 1, num = 0;_for (i, 0, len) {ll c = s[i] - "a";jl[nxt[p][c]] = 1;if (jl[fail[nxt[p][c]]]) f[nxt[p][c]] = std::max (f[nxt[p][c]], f[fail[nxt[p][c]]]);num = std::max (num, f[nxt[p][c]]);p = nxt[p][c];}return f[p] = std::max (f[p], num + w);}};}namespace SOLVE {ll n, m, w[N], ans; std::string s[N];ACAUTOMATON::ACAutomaton ac;inline ll rnt () {ll x = 0, w = 1; char c = getchar ();while (!isdigit (c)) { if (c == "-") w = -1; c = getchar (); }while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();return x * w;}inline void In () {ac.Clear ();n = rnt (), ans = 0;_for (i, 1, n) {std::cin >> s[i], w[i] = rnt ();if (w < 0) continue;ac.Insert (s[i]);}return;}inline void Solve () {ac.Build ();_for (i, 1, n) {if (w[i] < 0) continue;ans = std::max (ans, ac.GetAns (s[i], w[i]));}return;}inline void Out () {printf ("%lld\n", ans);return;}}
密码
首先如果存在一个随意填的位置,那么方案数至少为 \(52>42\)。例如:
7 2goodday
*gooday
和 gooday*
中 *
的位置可以填 \(26\) 个字母,方案数至少为 \(2\times26=52\)。
那么只要不存在随意填的位置,输出就比较方便了。
设 \(f_{u, l, sta}\) 表示到节点 \(u\),字符串长度为 \(l\),已经经过的字符串状态为 \(sta\) 时的最短字符串,直接暴力广搜转移算出方案数,如果小于 \(42\) 就爆搜每种方案即可。
代码比较恶心,贴一下:
点击查看代码
namespace ACAUTOMATON {class ACAutomaton {private:ll cnt = 0, tot = 1, nxt[N][26], fail[N], end[N], f[N][30][M], jl[N][30][M][2];class APJifengc { public: ll u, l, s; };std::pair vis[30 * 45];std::vector answer;char temp[N];public:inline void Insert (char *s, ll id) {ll p = 0, len = strlen (s + 1);_for (i, 1, len) {ll c = s[i] - "a";if (!nxt[p][c]) nxt[p][c] = ++cnt;p = nxt[p][c];}end[p] |= 1 << (id - 1);return;}inline void Build () {std::queue q;_for (i, 0, 25) if (nxt[0][i]) fail[nxt[0][i]] = 0, q.push (nxt[0][i]);while (!q.empty ()) {ll u = q.front (); q.pop ();_for (i, 0, 25) {if (nxt[u][i]) fail[nxt[u][i]] = nxt[fail[u]][i], end[nxt[u][i]] |= end[nxt[fail[u]][i]], q.push (nxt[u][i]);else nxt[u][i] = nxt[fail[u]][i];}}return;}inline ll BFS (ll target,ll m) {std::queue q;ll ans = 0; f[0][0][0] = 1;q.push ((APJifengc){0, 0, 0});while (!q.empty ()) {ll u = q.front ().u, l = q.front ().l, s = q.front ().s; q.pop ();if (l > m) break;if (s == target && l == m) ans += f[u][l][s];_for (i, 0, 25) {ll v = nxt[u][i], ln = l + 1, st = s | end[v];if (!f[v][ln][st]) q.push ((APJifengc){v, ln, st});f[v][ln][st] += f[u][l][s];}}return ans;}inline ll DFS (ll u, ll l, ll s, ll target, ll m) {if (jl[u][l][s][0]) return jl[u][l][s][1];jl[u][l][s][0] = 1;if (l == m) return jl[u][l][s][1] = (s == target);_for (i, 0, 25) jl[u][l][s][1] |= DFS (nxt[u][i], l + 1, s | end[nxt[u][i]], target, m);return jl[u][l][s][1];}inline void PrintAns (ll u, ll l, ll s, ll m) {if (!jl[u][l][s][1]) return;if (l == m) { puts (temp + 1); return; }_for (i, 0, 25) temp[l + 1] = i + "a", PrintAns (nxt[u][i], l + 1, s | end[nxt[u][i]], m);return;}};}namespace SOLVE {ll n, m, ans; char s[20];ACAUTOMATON::ACAutomaton ac;inline ll rnt () {ll x = 0, w = 1; char c = getchar ();while (!isdigit (c)) { if (c == "-") w = -1; c = getchar (); }while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();return x * w;}inline void In () {m = rnt (), n = rnt ();_for (i, 1, n) {scanf ("%s", s + 1);ac.Insert (s, i);}return;}inline void Solve () {ac.Build ();ans = ac.BFS ((1 << n) - 1, m);if (ans <= 42) ac.DFS (0, 0, 0, (1 << n) - 1, m);return;}inline void Out () {printf ("%lld\n", ans);if (ans <= 42) ac.PrintAns (0, 0, 0, m);return;}}
禁忌
有点像 GT 考试
设 \(f_{i, u}\) 表示长度为 \(i\),到了节点 \(u\) 的串的期望伤害。
\[f_{i, u} = \frac{1}{alphabet}\sum_{son_{v,c} = u} f_{i - 1,v}\]但是 \(len\le10^9\),不能直接转移。
于是套一下矩阵乘法就好了。
码:
点击查看代码
namespace MATRIX {class Matrix {private:ll n; ldb a[N][N];public:inline ldb* operator [] (ll x) { return a[x]; }inline void Init (ll nn) { n = nn, memset (a, 0, sizeof (a)); return; }inline Matrix operator * (Matrix another) const {Matrix ans; ans.Init (n);_for (i, 0, n) _for (j, 0, n) _for (k, 0, n)ans[i][j] += a[i][k] * another[k][j];return ans;}inline void Print () {printf ("%lld\n", n);_for (i, 0, n) { _for (j, 0, n) printf ("%Lf ", a[i][j]); puts (""); }puts ("");return;}};}namespace ACAUTOMATON {class ACAutomaton {private:ll cnt = 0, nxt[N][26], fail[N], end[N];public:inline void Insert (std::string s) {ll p = 0, len = s.length () - 1;_for (i, 0, len) {ll c = s[i] - "a";if (!nxt[p][c]) nxt[p][c] = ++cnt;p = nxt[p][c];}end[p] = 1;return;}inline ll Build (ll alphabet) {std::queue q;_for (i, 0, alphabet - 1) if (nxt[0][i]) fail[nxt[0][i]] = 0, q.push (nxt[0][i]);while (!q.empty ()) {ll u = q.front (); q.pop ();_for (i, 0, alphabet - 1) {if (nxt[u][i]) fail[nxt[u][i]] = nxt[fail[u]][i], q.push (nxt[u][i]);else nxt[u][i] = nxt[fail[u]][i];}end[u] |= end[fail[u]];}return cnt;}inline MATRIX::Matrix GetMatrix (ll alphabet) {MATRIX::Matrix ma; ma.Init (cnt + 1);_for (i, 0, cnt) {_for (j, 0, alphabet - 1) {if (end[nxt[i][j]]) ma[i][0] += 1.0 / (ldb)(alphabet), ma[i][cnt + 1] += 1.0 / (ldb)(alphabet);else ma[i][nxt[i][j]] += 1.0 / (ldb)(alphabet);}}ma[cnt + 1][cnt + 1] = 1.0;return ma;}};}namespace SOLVE {ll n, m, len, alphabet;std::string s[N];MATRIX::Matrix ans;ACAUTOMATON::ACAutomaton ac;inline ll rnt () {ll x = 0, w = 1; char c = getchar ();while (!isdigit (c)) { if (c == "-") w = -1; c = getchar (); }while (isdigit (c)) x = (x << 3) + (x << 1) + (c ^ 48), c = getchar ();return x * w;}inline MATRIX::Matrix FastPow (MATRIX::Matrix a, ll b) {MATRIX::Matrix an; an.Init (m);_for (i, 0, m) an[i][i] = 1.0;while (b) {if (b & 1) an = an * a;a = a * a, b >>= 1;}return an;}inline void In () {n = rnt (), len = rnt (), alphabet = rnt ();_for (i, 1, n) {std::cin >> s[i];ac.Insert (s[i]);}return;}inline void Solve () {m = ac.Build (alphabet) + 1;MATRIX::Matrix ma = ac.GetMatrix (alphabet);ans.Init (m), ans[0][0] = 1.0;ma = FastPow (ma, len), ans = ans * ma;return;}inline void Out () {printf ("%.10Lf\n", ans[0][m]);return;}}
关键词:
「学习笔记」AC 自动机
全球今亮点!P4093[HEOI2016/TJOI2016]序列
Python 脚本部署和发布 Django 应用程序的示例代码及注释
观速讯丨北京安监局特种作业证查询_安监局特种作业证查询
天天即时:【金融街发布】深交所发布两项公司债券信息披露业务指引
吃水果为什么可以解酒?苹果葡萄等五种水果最佳
滚动:自动驾驶数据遭破坏时 工信部:应能识别记录
iPhone 14 Pro Max用户换上Redmi Note 12 Turbo 1T版:花2000多很值
比亚迪的刀片 终于“捅向”特斯拉|天天最资讯
半年亏7千万 老板想跳楼!新能源造富运动结束了_环球新资讯
关于雷的成语_关于一的成语_天天滚动
声音检测报警模块方案解析
【天天时快讯】这座“中国建造”让洪都拉斯人有了更多期盼
曝光收车、卖车“套路” 博主被人人车发删稿函
天天速递!死磕影像!曝小米14系列将搭载独家WLG高透镜片
干翻Java/C++!Python成最受开发者欢迎编程语言:岗位报酬高居第一_环球快消息
热点在线丨山东71岁爷爷一年2次外出卖止咳蜂蜜糖:一待就是一两个月
当前信息:92岁巴菲特还没有退休计划:曾直言身体“不能再好了”
教育部:开展校外培训“平安消费”专项行动
JavaScript原型链污染学习记录
记录-Symbol学习笔记|环球速看
璞华助力“数字人社”,为成都市人社数字化建设提供多方位的产品与技术支持!
ChatGPT背后的打工人:你不干,有的是AI干_今热点
世界热讯:elementUi+table实现表格数据滚动
中梁控股2023年1-4月累计交付房屋22399套
全球热消息:【金融街发布】上交所修订发布公司债券存续期信息披露业务指引
每日头条!【财经分析】北京银行多项指标大幅落后同行 城商行“一哥”地位堪忧
世界资讯:对标千元级耳机!真我Buds Air5 Pro无线耳机官宣
天天热文:全球首例!我国完成介入式脑机接口非人灵长类动物试验:比马斯克公司更安全
一老年代步三轮车高速路狂飙:大众车速95km/h勉强跟上-全球新动态
新研究表明:超7成用户在手机电量低于20%时感到焦虑
《原子之心》通过Steam Deck验证 上手把玩姐妹花! 当前时讯
全球热资讯!歌尔股份发布首款XR智能交互手环参考设计
速讯:《安富莱嵌入式周报》第311期:300V可调节全隔离USB PD电源,开源交流负载分析仪,CANFD Trace,6位半多斜率精密ADC设计,开源数学库
淘金币在哪里看_淘金币多久过期 世界讯息
嵘泰转债异常交易处理结果出炉:匹配成交取消 不影响转股赎回|世界信息
Redmi MAX 90英寸巨屏电视发布 首发只要7999元 天天关注
没有5G卖4G的华为手机好起来了!一季度出货量增加14%:排名全球第十|焦点滚动
没有肛门只吃不拉!儿时经常把玩的小虫:如今一斤卖6千-当前看点
环球动态:手机通话增加患高血压风险 专家建议:每周接打电话不超半小时
反串还是自爆?一日产轩逸车主:高速只开80、尽量不走慢车道_世界焦点
厨电行业消费疲软,老板电器该如何突围?
天天百事通!绘画手残党的福音:涂鸦线稿秒变绝美图像
天天快播:保障用户买到限量版玩具,泡泡玛特用AIGC加持的验证码防范羊毛党
【光伏预报/太阳能预报】上海道宁与Solargi为您提供开发地理数据库模拟工具和网络服务 天天亮点
今日热门!Vue3项目(Vite+TS)使用Web Serial Api全记录
【快播报】抓住医院信息集成平台建设核心诉求
奥赛康:股东拟减持公司不超1%股份|环球焦点
世界黄金协会:一季度黄金总需求同比增长1% 央行购金仍可能成为今年支撑黄金需求的基石
每日看点!李蓓回应基金封盘:宁肯选择维持第二梯队的规模并争取维持一流的业绩
小伙日行三万步逛杭州 “特种兵式旅游”致半月板损伤
国内一集装箱惊现三辆特斯拉新跑车:被遗弃13年-全球讯息
凌晨四点的淄博什么样?烧烤店老板凌晨抢肉:热闹非凡_今日聚焦
自媒体称4月份接2笔理想商单共计30万 李想:造谣、法务部出来干活|每日消息
官方晒蒂法8岁、13岁美术设定图 身着连衣裙天真烂漫
网盘教育专享版,助力高校信息化和科研
环球信息:基于原子范数的深度展开网络实现
天天看热讯:Apache 配置https虚拟主机
世界快看点丨到底什么是小程序插件?
天天报道:如何不显示我的电脑、回收站等图标?
烟台高新区不断推进工程建设项目审批“应享尽享”水平 世界速看料
不愧是高端旗舰 RTX 4090游戏本性能爆棚:前提不差钱
高达12种!小米13成为史上颜色最多的小米手机
掀翻OLED!苹果自研MicroLED屏幕:进展顺利-每日速看
咋回事?董明珠1150万股格力股份遭冻结 市值约4亿元
对标拼多多?抖音推出“超便宜的小店”:试水低价电商|全球快看点
无锡市举办纪念五四运动 104周年主题团日活动
【天天速看料】Java基础学习之大数字处理相关的类有哪些?
将Windows系统设置NTP服务器-NetTime篇
金仓数据库字符串分割函数_天天速看料
深圳:港澳青年在深创业个人最高可贷60万元
苹果联合创始人炮轰马斯克自动驾驶画饼:想死就买特斯拉!
李佳琦面试75岁奶奶主播引围观:老人直呼为推广国货努力 这是国家自信
环球即时:调试器是个大骗子!
快速高效的C#FTP文件传输库FluentFTP|全球速讯
开心档之MySQL 导入数据-焦点报道
开封市通许县四所楼镇:让社情民意联络点当好民声传话筒|全球快讯
支持华为HMS服务!酷比魔方Pad 50Pro发布 首发899元
世界热点评!陌陌被苹果下架 官方回应:技术问题正解决 老用户不影响
这五一超20万人去淄博:鲁C变身网红旅游名城_快资讯
当前讯息:怎么看?老人欲插队被服务员严词拒绝:前有插队婆孙被网曝 还被做车贴很恶心
功能不成熟 马斯克推特直播秒变马赛克 网友吐槽:8-Bit埃隆_世界新要闻
今年全国快递业务量突破400亿件
常用的热门 API 汇总 环球热推荐
即时看!jasperreport开发手册--ireport教程
世界百事通!什么是EMR?为什么要以电子病历(EMR)为核心,建设医院信息集成平台?
安全验证必备——语音验证码短信 API 当前快看
火山引擎 DataTester 上线全新 MAB 智能调优实验
坎普斯boss怎么打_坎普斯怎么打_当前快讯
一机多用:劲能电钻/电动螺丝刀39元起(100元大额券) 每日速递
【天天热闻】向华为供货740万块硬盘 被重罚3亿美元!希捷:已和解并开始付罚金
当前观点:特斯拉公共充电桩功率仅23KW 比亚迪车主一度愧疚:把人家功率吸走了
又一五菱神车!宝骏悦也5月15日首发:车尾背个“大手表”
iPhone平均售价越来越高了!Pro和Pro Max最受果粉喜爱
当前短讯!浙江师范大学2023年硕士研究生复试录取办法
seventeen是哪个公司?seventeen在韩国是几线?seventeen有几个人?
冰淇淋和冰激凌区别是什么?明胶在冰淇淋中的作用是什么?
厨师的高帽子叫什么?为什么厨师要戴白色高帽子?
梦华录里的西京是哪里?梦华录是在哪些地方取景?
富士山在日本的哪里?富士山是私人的吗?富士山为什么是私人的?