国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

【BZOJ 4567】【SCOI 2016】背單詞

2019-11-06 06:05:50
字體:
供稿:網(wǎng)友

又是一道題意殺………… 首先可以發(fā)現(xiàn)1號操作顯然不能出現(xiàn)。 然后我們把所有單詞倒著建一棵trie,去掉一些沒有用的節(jié)點(diǎn)。比如說abbbb和bb這兩個單詞,abbbb的前兩個b是多余的。所以最后留下來的樹,每個節(jié)點(diǎn)(根節(jié)點(diǎn)除外)都代表了一個單詞。所以題目就變成了給每個節(jié)點(diǎn)編號。 首先為了不出現(xiàn)1號操作,每個父親節(jié)點(diǎn)的編號都必須比孩子編號小。然后顯然就是一個dfs序(別告訴我為什么顯然我也不知道TAT) 然后就要考慮優(yōu)先訪問那個孩子。其實(shí)這也是比較(不)顯然的,一定優(yōu)先訪問size較小的子樹。感性的想一想,如果有5個孩子1、2、3、4、5,當(dāng)前訪問1的子樹的時候,每次訪問到1的新孩子,2、3、4、5的編號就要統(tǒng)統(tǒng)向后移一位。 如果這都不夠感性,那就想想打cf的時候,為什么從簡單的做起分?jǐn)?shù)高?一開始每道題目每分鐘扣4分,一旦做出一道題,那么這道題的時間分就不會動了。放到這道題也是一個道理。(感覺寫完這段自己就成了個傻逼) 然后。。。不要問我空間為什么頂著上限。。我已經(jīng)分不清1e5和5e5了。

#include<cmath>#include<cstdio>#include<vector>#include <queue>#include<cstring>#include<iomanip>#include<stdlib.h>#include<iostream>#include<algorithm>#define ll long long#define inf 1000000000#define mod 1000000007#define N 500050#define fo(i,a,b) for(i=a;i<=b;i++)#define fd(i,a,b) for(i=a;i>=b;i--)using namespace std;char s[N];int rt,n,i,tot;ll res;int son[N][30],tag[N],id[N],siz[N],num[N];vector<int> sn[N/5];void ins(){ int len = strlen(s+1); int p = rt; int i; fd(i,len,1) { if (!son[p][s[i]-'a']) son[p][s[i]-'a'] = ++tot; p = son[p][s[i]-'a']; } tag[p] = 1;}void dfs(int x){ int i; if (tag[x]) {sn[id[x]].push_back(++tot); id[x] = tot;} fo(i,0,25) if (son[x][i]) { id[son[x][i]] = id[x]; dfs(son[x][i]); }}void dfs2(int x){ siz[x] = 1; for (int i = 0;i < sn[x].size(); i++) { int t = sn[x][i]; dfs2(t); siz[x] += siz[t]; }}bool cmp(int x,int y) {return siz[x] < siz[y];}void calc(int x){ sort(sn[x].begin(),sn[x].end(),cmp); for (int i = 0;i < sn[x].size(); i++) { int t = sn[x][i]; num[t] = ++tot; res += num[t] - num[x]; calc(t); }}int main(){ scanf("%d",&n); tot = rt = 1; fo(i,1,n) {scanf("%s",s+1); ins();} id[1] = tot = 1; dfs(1); dfs2(1); tot = 0; calc(1);
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黑山县| 黔西县| 宜丰县| 砚山县| 嵩明县| 大厂| 宜兴市| 侯马市| 庄浪县| 贵港市| 铜山县| 唐河县| 银川市| 林州市| 江陵县| 定西市| 威海市| 麦盖提县| 绵阳市| 东平县| 湾仔区| 高安市| 麟游县| 龙门县| 柏乡县| 和田县| 兴和县| 通城县| 达州市| 高碑店市| 弋阳县| 乐业县| 新宁县| 宁明县| 岗巴县| 吴川市| 阿图什市| 阳信县| 沙河市| 瑞昌市| 康乐县|