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

首頁 > 學院 > 開發設計 > 正文

UVA 11732 strcmp() Anyone? Trie的左兒子右兄弟表示法

2019-11-10 17:45:26
字體:
來源:轉載
供稿:網友

        思考了一會兒,發現這題目要一層層的考慮。

        即,在插入一個字符串str到Trie的時候,同時更新答案

        兩個字符串,在對比到第i個位置不同時,通過的比較次數是(i<<1)+1,注意,此處i是從0開始的。

        假若到最后都相同的話,比較的次數是(length+1)<<1,即length*2+2,要考慮末尾的/0

        抱著這樣的想法,我發現普通的Trie并不好維護這個玩意,看了題解才明白。

        沒想到在這里遇見了左兒子右兄弟表示法,也是,這個表示法是比較符合這個場景的

        邊插入邊計算答案,每到一層就+上那些當前位和自己不同的字符串的比較次數,到最后+上和自己相同的比較次數

        用val數組來維護當前通過該點的字符串個數

        總之感覺用法很好,在Trie中插入節點的時候有點數組模擬鄰接表的感覺了

#include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;int n,kcase=1,sz,bro[4000010],son[4000010],val[4000010];char str[1005],ch[4000010];void init(),ins(char* str);ll ans;int main(){    ios_base::sync_with_stdio(false);    while(cin>>n&&n){        init();        ans=0;        for(int i=0;i<n;++i){            cin>>str;            ins(str);        }        cout<<"Case "<<kcase++<<": "<<ans<<endl;    }    return 0;}void init(){    sz=1;    ch[0]=bro[0]=son[0]=val[0]=0;}void ins(char* str){    int len=strlen(str),u=0,p;    for(int i=0;i<=len;++i){        for(p=son[u];p;p=bro[p])        if(ch[p]==str[i])            break;        if(!p){            p=sz++;            ch[p]=str[i];            bro[p]=son[u];            son[p]=val[p]=0;            son[u]=p;        }        ans+=(val[u]-val[p])*((i<<1)+1);        if(len==i){            ans+=val[p]*((i+1)<<1);            ++val[p];        }        val[u]++;        u=p;    }}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 井冈山市| 图木舒克市| 手机| 广丰县| 孝昌县| 凭祥市| 汝州市| 南靖县| 庆元县| 南昌县| 新沂市| 长岛县| 夹江县| 清河县| 抚宁县| 安新县| 合江县| 沂水县| 师宗县| 正阳县| 鞍山市| 甘谷县| 正安县| 临城县| 南通市| 句容市| 稻城县| 嘉祥县| 临洮县| 浑源县| 吴忠市| 绥江县| 兴义市| 富源县| 东宁县| 观塘区| 灵丘县| 嫩江县| 辉南县| 齐河县| 常熟市|