编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#20662 #1059. 1-07E. JM的模板题 Accepted 100 5976 ms 138580 K C++ 11 / 2.7 K JM233333 2019-07-29 21:09:18
显示原始代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>

using namespace std;
typedef long long ll;

const int SIZE = 26;

class Trie {
public:
    bool existed;
    int next[SIZE];
    int fail;
    int match;
};

void insert(char* s, int id);
void build();
void search(char* s);
void add_edge(int u, int v);
void dfs(int index);

const int MAX = 1e6 + 5;
Trie trtree[MAX];
Trie* const trie = trtree + 1;
int trcnt;
char S[MAX], Ti[MAX];
vector<int> graph[MAX];
int record[MAX], res[MAX];

int main() {
    // freopen("test.txt", "r", stdin);
    int n;
    while (scanf("%s", S) != EOF) {
        // 初始化
        memset(trtree, 0, 2 * sizeof(Trie));
        trie[0].fail = -1;
        trcnt = 0;
        for (int i = 0; i < MAX; i++) {
            graph[i].clear();
        }
        memset(record, 0, sizeof(record));
        memset(res, 0, sizeof(res));
        // 输入
        scanf("%d", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%s", Ti);
            insert(Ti, i);
        }
        // 建立自动机
        build();
        // 匹配自动机
        search(S);
        // DFS
        dfs(0);
        // 求和
        ll sum = 0;
        for (int i = 1; i <= n; i++) {
            sum += res[record[i]];
        }
        // 输出
        printf("%lld\n", sum);
    }
    return 0;
}
// 字典树:插入
void insert(char* s, int id) {
    // 主循环
    int index = 0;
    for (int i = 0; s[i] != '\0'; i++) {
        // 获取子节点
        int& pos = trie[index].next[s[i] - 'a'];
        // 插入
        if (!pos) {
            pos = ++trcnt;
            memset(&trie[pos], 0, sizeof(Trie));
        }
        // 递进
        index = pos;
    }
    // 计数
    trie[index].existed = true;
    record[id] = index;
}
// AC自动机:建立
void build() {
    // BFS
    queue<int> q;
    q.push(0);
    while (!q.empty()) {
        // 出队
        int t = q.front();
        q.pop();
        // 遍历字符集
        for (int i = 0; i < SIZE; i++) {
            // 获取子节点
            int& pos = trie[t].next[i];
            // 更新位置信息
            if (!pos) {
                pos = trie[trie[t].fail].next[i];
            } else {
                // 入队
                q.push(pos);
                // 标记
                trie[pos].fail = trie[trie[t].fail].next[i];
                trie[pos].match = (trie[pos].existed ? pos : trie[trie[pos].fail].match);
                // 建图
                add_edge(trie[trie[pos].fail].match, pos);
            }
        }
    }
}
// AC自动机:查找
void search(char* s) {
    // 主循环
    int index = 0;
    for (int i = 0; s[i] != '\0'; i++) {
        // 递进
        index = trie[index].next[s[i] - 'a'];
        // 记录最长匹配
        int tmp = trie[index].match;
        if (trie[tmp].existed) {
            res[tmp]++;
        }
    }
}
// 加入新边
inline void add_edge(int u, int v) { graph[u].push_back(v); }
// 深度优先搜索
void dfs(int u) {
    for (int i = 0; i < graph[u].size(); i++) {
        int v = graph[u][i];
        dfs(v);
        if (trie[u].existed && trie[v].existed) {
            res[u] += res[v];
        }
    }
}
子任务 #1
Accepted
得分:100
测试点 #1
Accepted
得分:100
用时:264 ms
内存:137800 KiB

输入文件(1.in

ababaaabbbbbbbaabaaaaababababbaaabbaabaabaabaaabbaaababbbabbaababbaabbababbaabbaaabbabbbaaaabaabbbaa
<2000107 bytes omitted>

答案文件(1.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #2
Accepted
得分:100
用时:227 ms
内存:138564 KiB

输入文件(2.in

bbaaaabaaaabbbbaaabbbbabbaaabaaabbbbbaaabababaabbbaaabbabaaaababaaabababbabaaababbbabbabababaaaababb
<2000107 bytes omitted>

答案文件(2.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #3
Accepted
得分:100
用时:282 ms
内存:138564 KiB

输入文件(3.in

ababbbaaaababbababaaabbbbabbaabaabbaaababbabbbaaaaaabababbbbabaababaabaaaaaabbbabbabbbbbbbbabbababba
<2000107 bytes omitted>

答案文件(3.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #4
Accepted
得分:100
用时:217 ms
内存:138548 KiB

输入文件(4.in

bbbbbabbaaabbaaabbabbbabbbabbabaaababbaaabaaabababbaaaabbaaabbbbbbbabbabaabbaabbabababaaaaababbabaaa
<2000107 bytes omitted>

答案文件(4.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #5
Accepted
得分:100
用时:204 ms
内存:138560 KiB

输入文件(5.in

abaaaaaabbaaaaabaabaabbaaaaabbbbbaababbaaabbaaababbbbaaaaaaaaaaabaababbabbbbaaaaababbbbbbaabbbbabbab
<2000107 bytes omitted>

答案文件(5.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #6
Accepted
得分:100
用时:206 ms
内存:138508 KiB

输入文件(6.in

babbbbbabbaabbbbabbbababbaaabaabaaabaabbaabbbabbbaaabbbabbbbbbbabbbabaabbbbabbbababaaaabbababaababaa
<2000107 bytes omitted>

答案文件(6.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #7
Accepted
得分:100
用时:210 ms
内存:138580 KiB

输入文件(7.in

baaaaaaaaabaabbbbbbabababbaabaababbbaababbbbabaabababaabbabaabaabbaaaabaaabbabaabbbbbbabababbbbbbabb
<2000107 bytes omitted>

答案文件(7.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #8
Accepted
得分:100
用时:211 ms
内存:138536 KiB

输入文件(8.in

baababbbbbbbbaaabbbbbbbbbabbaabbaaaaabababbbbbabbbababaaaaabababbbaababaaaabbbababababbaabbaabbabbab
<2000107 bytes omitted>

答案文件(8.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #9
Accepted
得分:100
用时:208 ms
内存:138540 KiB

输入文件(9.in

abbbbaabbbbbaabbaaabaaabbbbabbbaaabbbbaaababbbbbbabbaaababaaaaaaabaabbbaaabbbaabbbabbbbabbbbbaababba
<2000107 bytes omitted>

答案文件(9.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #10
Accepted
得分:100
用时:216 ms
内存:138552 KiB

输入文件(10.in

aaababbbaabbabaaaababbabaaabaabbaabbbbbbbaababbabbbaaababbaabbaaabbabababbaabaaabaaababaaaaaabbabbba
<2000107 bytes omitted>

答案文件(10.out

0

用户输出

0

系统信息

Exited with return code 0
测试点 #11
Accepted
得分:100
用时:341 ms
内存:64372 KiB

输入文件(11.in

cbedbecbbaacaaedadbaaadebacdcdeaebdeaeccaeccedcddadcaeddadcedebeadeeebabeebadaeeccabaececebdabcdcbbe
<2199910 bytes omitted>

答案文件(11.out

10266

用户输出

10266

系统信息

Exited with return code 0
测试点 #12
Accepted
得分:100
用时:352 ms
内存:64304 KiB

输入文件(12.in

caacebdeebebecebcabecedeccdcacaaadeddaddbebeddecaddcebdeaababaebadbbebacdabccdcbdbabdadaeccdecbcccde
<2199910 bytes omitted>

答案文件(12.out

10165

用户输出

10165

系统信息

Exited with return code 0
测试点 #13
Accepted
得分:100
用时:316 ms
内存:64344 KiB

输入文件(13.in

ecacbcbaccbacdedebaebeabaaeabccbedaaceaaeabbbcbbacadbbadeceacbdbdebadcdabcdeeebaaedaaacacebbccecaddb
<2199910 bytes omitted>

答案文件(13.out

10003

用户输出

10003

系统信息

Exited with return code 0
测试点 #14
Accepted
得分:100
用时:358 ms
内存:64260 KiB

输入文件(14.in

dbcdaaebbadbddcebebbbcaabebbadbaeddeadcccddedbabcdbdeebbebbbdaecdadedcaaabedcecbdcdbadbeabeaebcceccb
<2199910 bytes omitted>

答案文件(14.out

10297

用户输出

10297

系统信息

Exited with return code 0
测试点 #15
Accepted
得分:100
用时:339 ms
内存:64332 KiB

输入文件(15.in

eddecaacdbacbedaaaecacecdaedbdcbcaeeddedaacbecbabcbababcbddbabbbaccebcbbecdadadcbeabbdadabbdecdeacee
<2199910 bytes omitted>

答案文件(15.out

10355

用户输出

10355

系统信息

Exited with return code 0
测试点 #16
Accepted
得分:100
用时:351 ms
内存:64272 KiB

输入文件(16.in

cdacecdebdabeeedddadbdaabbdecaeaabebaaacdcccddebbeeaecdedcacbaabedccdececbdbbcdedbeaccbeaeeebdaaaceb
<2199910 bytes omitted>

答案文件(16.out

10238

用户输出

10238

系统信息

Exited with return code 0
测试点 #17
Accepted
得分:100
用时:353 ms
内存:64316 KiB

输入文件(17.in

cddbdacadcdcdeebcbedaeaeaabbbedabecddeaecededdeddddeececadceabcdcbedeccbeeaccbccaeeddaecccbeaedebeba
<2199910 bytes omitted>

答案文件(17.out

10314

用户输出

10314

系统信息

Exited with return code 0
测试点 #18
Accepted
得分:100
用时:329 ms
内存:64276 KiB

输入文件(18.in

ecdceedcbcbdbccbccbbeeeceeedcaaeebecceaaecacbacdcdebbceaecddacaadeeedbbeacdbdccccbeaebeaacbdcdecaacd
<2199910 bytes omitted>

答案文件(18.out

10392

用户输出

10392

系统信息

Exited with return code 0
测试点 #19
Accepted
得分:100
用时:323 ms
内存:64240 KiB

输入文件(19.in

adeedbeeccaadcebededeadbbbddebdcbcabcbaaddaccdddddeebdeccdedbdbcccebcbdbbcbdcbeeacdbaaebdebadbdaecad
<2199910 bytes omitted>

答案文件(19.out

10195

用户输出

10195

系统信息

Exited with return code 0
测试点 #20
Accepted
得分:100
用时:356 ms
内存:64240 KiB

输入文件(20.in

abcacbdccbdaeebbccbbdadacaebceebdacbbcccebdcbacddbabaeccdbcbeeecddeddacabadbbbceeadbaabbcdeedeadcedd
<2199910 bytes omitted>

答案文件(20.out

10374

用户输出

10374

系统信息

Exited with return code 0
测试点 #21
Accepted
得分:100
用时:31 ms
内存:21020 KiB

输入文件(21.in

ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss
<1502408 bytes omitted>

答案文件(21.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #22
Accepted
得分:100
用时:30 ms
内存:20992 KiB

输入文件(22.in

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
<1502408 bytes omitted>

答案文件(22.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #23
Accepted
得分:100
用时:33 ms
内存:21104 KiB

输入文件(23.in

nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
<1502408 bytes omitted>

答案文件(23.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #24
Accepted
得分:100
用时:31 ms
内存:21088 KiB

输入文件(24.in

iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
<1502408 bytes omitted>

答案文件(24.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #25
Accepted
得分:100
用时:35 ms
内存:21044 KiB

输入文件(25.in

dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
<1502408 bytes omitted>

答案文件(25.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #26
Accepted
得分:100
用时:29 ms
内存:21028 KiB

输入文件(26.in

rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr
<1502408 bytes omitted>

答案文件(26.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #27
Accepted
得分:100
用时:31 ms
内存:21016 KiB

输入文件(27.in

kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
<1502408 bytes omitted>

答案文件(27.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #28
Accepted
得分:100
用时:31 ms
内存:21004 KiB

输入文件(28.in

jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
<1502408 bytes omitted>

答案文件(28.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #29
Accepted
得分:100
用时:31 ms
内存:21060 KiB

输入文件(29.in

pppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp
<1502408 bytes omitted>

答案文件(29.out

999500500

用户输出

999500500

系统信息

Exited with return code 0
测试点 #30
Accepted
得分:100
用时:31 ms
内存:21036 KiB

输入文件(30.in

llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll
<1502408 bytes omitted>

答案文件(30.out

999500500

用户输出

999500500

系统信息

Exited with return code 0