AC自动机

简单地说,AC自动机就是可以匹配好多字符串的东西。。。。
其实就是在Trie树上做KMP。
fail[i]表示的是i节点代表的串的意义就是在Trie上出现过的最长后缀(当然不包括自己)所在的节点。
如果暴力找fail[i]的话会超级慢,所以我们可以把值为0的tr[i][j]赋为tr[fail[i]][j]。注意要按BFS序求fail[i],因为dep[i]>dep[fail[i]]。
然后就可以快乐地匹配啦!
TJOI2013 单词

#include<bits/stdc++.h>
using namespace std;
#define fp(i, b, e) for ( int i = b, I = e; i <= I; ++i )
#define fd(i, b, e) for ( int i = b, I = e; i >= I; --i )
#define go(i, b) for ( int i = b, v = to[b]; i; v = to[i = nxt[i]] )
#define i64 long long
inline bool cmin( int &x, int y ){ return x > y ? x = y, 1 : 0; }
inline bool cmax( int &x, int y ){ return x < y ? x = y, 1 : 0; }

const int _ = 1e6 + 55;
int N; string s[205];
int tr[_][26], num, fail[_], id[205], cnt[_];
vector<int> e[_];
queue<int> Q;

void Ins( int k, string s ){
    int cur(0), d;
    fp( i, 0, s.size() - 1 ){
        d = s[i] - 'a';
        if ( !tr[cur][d] ) tr[cur][d] = ++num;
        cur = tr[cur][d];
    } id[k] = cur;
}

void Build(){
    fp( i, 0, 25 ) if ( tr[0][i] ) Q.push(tr[0][i]);
    while( !Q.empty() ){
        int t(Q.front()); Q.pop();
        fp( i, 0, 25 ){
            if ( tr[t][i] ){
                fail[tr[t][i]] = tr[fail[t]][i];
                Q.push(tr[t][i]);
            } else tr[t][i] = tr[fail[t]][i];
        }
    }
}

void DFS( int u, int fa ){
    for ( int v : e[u] ) if ( v != fa ){
        DFS(v, u);
        cnt[u] += cnt[v];
    }
}

int main(){
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> N;
    fp( i, 1, N ) cin >> s[i], Ins(i, s[i]);
    Build();
    fp( i, 1, N ){
        int cur(0);
        fp( j, 0, s[i].size() - 1 )
            cur = tr[cur][(int)(s[i][j] - 'a')], ++cnt[cur];
    }
    fp( i, 1, num ) e[fail[i]].push_back(i), e[i].push_back(fail[i]);
    DFS(0, 0);
    fp( i, 1, N ) printf( "%d\n", cnt[id[i]] );
    return 0;
}
全部评论

相关推荐

2025-12-01 16:35
内蒙古工业大学 Java
上个月实习了7天被开,哎想起来真窝囊,领导叫我去会议室,问我技术栈,当时紧张的,问我有没有做项目啥的,我说没有,有练习,其实我也是做过两个项目的但是,当时紧张的说不出来,就说会java,springboot,我没好好看系统,就说系统是增删改查,他让我回去再看,说熟悉完再看走开发路线还是实施什么的路线,3天后问我,我说这是一个审批系统,其实也不是,是一个检测系统,主要流程是委托&nbsp;&nbsp;受理然后&nbsp;样品管理&nbsp;报告管理&nbsp;审核啥的&nbsp;。然后问我你觉得系统的好处是啥,忘了当时咋说的了,让我回去再熟悉一下。第二周也没安排任务,没有配电脑,然后周二,我当时企业微信没看,和朋友聊天呢,然后他发了任务一个小时之后我才看到,然后我回复的时候是3点半,未读过了一会儿hr给我叫到小黑屋,说觉得不合适,然后让我填离职表。后来想想一开始要是自信点是不是就能配电脑然后开发了。租的房子转租也没租出去,该交房租了,好在当时是月付,没有选择季付,不然哭都没地方。又回到基地了,好久没学了,有时候我也在想为啥我这么消极,这么不自信,哎,面试什么的也挂了好多了。昨天我妈和我打电话说他年前体检就检查出来脸上骨头里面有囊肿,手术很复杂,说要经过鼻子,医生说手术之后容易感染,他老是头疼,我现在在实训基地,离家好远,我爸也有事,我妈说要不拖到我姐放假回去得1月。不知不觉这么多字了,现在是12.1下午4.20,刚面试完胜软,感觉躺平已经成了口头禅了,想离家远一点,但是每个月还是会问家里要生活费,教室和宿舍还是那样,但是不知为何,我总有一种物是人非的感觉,上厕所和接水要去四楼,我们之前的教室就在四楼,路过教室的时候总有一种恍惚的感觉。网上说高敏感是种天赋,我却感觉老是很痛苦,总是能听出一些弦外之音,可能人家也不是那个意思。我也不知道要表达啥了在都是大佬都群里面,默默的看着他们的发言,遇到问题找大佬解决,但是没有利益交换,大佬也会觉得厌烦的。焦虑什么的是能力跟不上欲望,每天一边郁郁寡欢一遍暴饮暴食,总是希望别人能关心一下自己,但自己也不常关心别人。之前一个大佬给我内推,但是我力扣也没刷都不好意思面试,发了两次面试通知我也没面。就到这里吧,毕业设计题目出来了,先学一下黑马的springboot3vue3全栈吧。
_mos_:别的不多说 就你上班聊天摸鱼整整一个小时不看信息我都觉得很抽象了别扯什么自己这那的 我感觉领导确实已经给你很多时间和空间了 自己还是想想有没有真的用心去做 不是什么东西都要别人推着你去干的 总得学会主动一点吧 最后中肯地说一句 卷不了还是别走互联网这条路了 不好意思说话有些直白但希望你可以明白我的意思
点赞 评论 收藏
分享
狸猫换offer:埋点都出来了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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