首页 > 其他 > 详细

hdu2896

时间:2020-02-05 22:47:13      阅读:84      评论:0      收藏:0      [点我收藏+]

题:http://acm.hdu.edu.cn/showproblem.php?pid=2896

分析:ac自动机模板

   注意细节,1、128个ascii码都要;

        2、只要关键码含有只输出一个编号就行;

技术分享图片
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<string>
using namespace std;
typedef long long ll;
#define pb push_back
const int M=1e5+6;

int trie[M][128]; 
int cntword[M];  
int fail[M],id[M];    
int cnt=0;
int vis[1002];

void insert(int x,string s){
    int root=0;
    for(int i=0;i<s.size();i++){
        if(!trie[root][s[i]])
            trie[root][s[i]]=++cnt;
        root=trie[root][s[i]];
    }id[root]=x;
    cntword[root]++;
    
}
void getfail(){
    queue<int>que;
    while(!que.empty())
        que.pop();
    for(int i=0;i<128;i++){
        if(trie[0][i]){
            fail[trie[0][i]]=0;
            que.push(trie[0][i]);
        }
    }
    
    while(!que.empty()){
        int now=que.front();
        que.pop();
        
        for(int i=0;i<128;i++){
            if(trie[now][i]){
                fail[trie[now][i]]=trie[fail[now]][i];
                que.push(trie[now][i]);
            }
            else
                trie[now][i]=trie[fail[now]][i];
        }
    }
}
int query(string s,int x){
    int num=0;
    int now=0;
    for(int i=0;i<s.size();i++){
        now=trie[now][s[i]];
        for(int j=now;j;j=fail[j]){
            num+=cntword[j];
        //    cntword[j]=-1;
            if(id[j])
                vis[id[j]]=1;
            ///    b[x].push_back(id[j]);
        }
    }
    return num;
}
int main(){
    int n;
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    string s;
    for(int i=1;i<=n;i++){
        cin>>s;
        insert(i,s);
    }
    fail[0]=0;
    getfail();
    int m;
    int ans=0;
    cin>>m;
    for(int i=1;i<=m;i++){
        cin>>s;
        memset(vis,0,sizeof(vis));
        if(query(s,i)>=1){
            cout<<"web "<<i<<":";
            for(int j=1;j<=n;j++){
                if(vis[j])
                    cout<< <<j;
            }
            cout<<\n;
            ans++;
            
        }
    }

    cout<<"total: "<<ans<<\n;
    return 0;
}
View Code

 

hdu2896

原文:https://www.cnblogs.com/starve/p/12266868.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!