[kuangbin带你飞]专题17:C

来源:互联网 发布:淘宝会员名大全 好听 编辑:程序博客网 时间:2024/06/05 20:31

原题

#include<iostream>#include<cstring>  #include<string>#include<cstdio>#include<queue>using namespace std;const int MAXN = 1010*55;int Next[MAXN][26], fail[MAXN], v[MAXN];int L, root;int num[1010];string s2[1010];int N;int newnode() {    for(int i = 0; i < 26; i++) Next[L][i] = -1;    fail[L] = -1;    v[L] = 0;     L++;    return L-1;}void insert(string s, int n) {    int l = (int)s.length();    int now = root;    for(int i = 0; i < l; i++) {        int id = s[i]- 'A';        if(Next[now][id] == -1) Next[now][id] = newnode();        now = Next[now][id];    }    v[now] = n;}void setfail() {    queue<int> q;    q.push(root);    while(!q.empty()) {        int now = q.front(); q.pop();        for(int i = 0; i < 26; i++) if(Next[now][i] != -1) {            int pre = fail[now];            while(pre != -1 && Next[pre][i] == -1) pre = fail[pre];            fail[Next[now][i]] = pre == -1 ? root : Next[pre][i];            q.push(Next[now][i]);        }    }}void query(string s) {    int now = root;    int l = (int)s.length();    for(int i = 0; i < l; i++) {        int id = s[i] - 'A';        if(id < 0 || id >= 26) now = -1;         while(now != -1 && Next[now][id] == -1) now = fail[now];        now = now == -1 ? root : Next[now][id];        for(int p = now; p != -1; p = fail[p]) if(v[p]) {            num[v[p]]++;        }    }    for(int i = 1; i <= N; i++) if(num[i]) cout << s2[i] << ": " << num[i] << endl;}int main() {    ios::sync_with_stdio(false);    freopen("a.in", "r", stdin);    while(cin >> N) {    //初始化    L = 0; root = newnode();    memset(num, 0, sizeof(num));    for(int i = 1; i <= N; i++) {        cin >> s2[i];        insert(s2[i], i);    }    setfail();    string ss; cin >> ss;    query(ss);    }    return 0;}
原创粉丝点击