原根

最优解

考虑建立一棵字典树,一个字符串为另一个字符串的前缀,当且仅当它对应的节点是另一个节点的祖先。所以我们建立完字典树之后,标记一下每个结点作为字符串的终点几次。最后从根开始往下搜索,当搜索到一个结束位置的时候,如果这个结束位置只代表一个字符串那么就统计入答案,不然就不统计。并且搜到一个结束位置就不用往下搜了,因为下面即使搜到了结束位置也不可能是原根,当前的结束位置必然会是它的祖先。
时间复杂度和空间复杂度都是

int ch[1000005][26];
int is_over[1000005];
int dfs(int u){
    if(is_over[u]){
        return (is_over[u] == 1);
    }
    int ans = 0;
    for(int i = 0; i < 26; ++i) if(ch[u][i]) ans += dfs(ch[u][i]);
    return ans;
}
int solve(int n, vector<string> s){
    int tot = 0; int rt = ++tot;
    memset(ch[rt], 0, sizeof ch[rt]); is_over[rt] = 0;
    for(int i = 0; i < n; ++i){
        int p = rt;
        for(int j = 0; j < s[i].size(); ++j){
            int x = s[i][j] - 'a';
            if(!ch[p][x]) {
                ch[p][x] = ++tot; memset(ch[tot], 0, sizeof ch[tot]);  is_over[tot] = 0;
            }
            p = ch[p][x]; 
        }
        is_over[p]++;
    }
    return dfs(rt);
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-11 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
小鹏、大疆、米哈游、MinMax小鹏上午投的下午就约面,进度未免也太快了
蛇年行大运fff:哥们 盗贴有意思吗,我发xhs上的给你搬过来了😅😅😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务