zoukankan      html  css  js  c++  java
  • HDU 2896

    EASY题

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <climits>
    #include <string.h>
    #include <queue>
    #include <cmath>
    #include <vector>
    
    using namespace std;
    const int dictsize=130;
    const int QN=400000;
    bool nvr[505];
    int n,m,ans_cnt,qf,ql;
    
    struct Node {
    	Node *fail;
    	Node *next[dictsize];
    	int count;
    	Node (){
    		for(int i=0;i<dictsize;i++)
    		next[i]=NULL;
    		fail=NULL;
    		count=0;
    	}
    	void initial(){
    		for(int i=0;i<dictsize;i++)
    		next[i]=NULL;
    		fail=NULL;
    		count=0;
    	}
    };
    Node *que[QN],*root;
    char inser[210],str[10010];
    
    
    void Insert_Trie(int counts){
    	Node *p=root;
    	int i=0,index;
    	while(inser[i]){
    		index=inser[i]-31;
    		while(!p->next[index]) p->next[index]=new Node();
    		p=p->next[index];
    		i++;
    	}
    	p->count=counts;
    }
    
    void set_fail(){
    	int i=0;
    	qf=ql=0;
    	root->fail=NULL;
    	que[ql++]=root;
    	Node *tmp,*p;
    	while(qf!=ql){
    		tmp=que[qf++];
    		p=NULL;
    		for(i=0;i<=128;i++){
    			if(tmp->next[i]){
    				if(tmp==root) tmp->next[i]->fail=root;
    				else{
    					p=tmp->fail;
    					while(p){
    						if(p->next[i]){
    							tmp->next[i]->fail=p->next[i];
    							break;
    						}
    						p=p->fail;
    					}
    					if(!p) tmp->next[i]->fail=root;
    				}
    				que[ql++]=tmp->next[i];
    			}
    		}
    	}
    }
    
    
    int query(){
    	int i=0,index,cnt=0;
    	Node *p=root,*tmp;
    	while(str[i]){
    		index=str[i]-31;
    		while(!p->next[index]&&p!=root) p=p->fail;
    		p=p->next[index];
    		p=p?p:root;
    		tmp=p;
    		while(tmp!=root){
    			if(tmp->count>0){
    				if(!nvr[tmp->count]){
    					nvr[tmp->count]=true;
    					cnt++;
    				}
    			}
    			tmp=tmp->fail;
    		}
    		i++;
    	}
    	return cnt;
    }
    
    int main(){
    	while(scanf("%d",&n)!=EOF){
    		root=new Node();
    		for(int i=1;i<=n;i++){
    			scanf("%s",inser);
    			Insert_Trie(i);
    		}
    		ans_cnt=0;
    		set_fail();
    		scanf("%d",&m);
    		for(int i=1;i<=m;i++){
    			memset(nvr,false,sizeof(nvr));
    			scanf("%s",str);
    			if(query()>0){
    				ans_cnt++;
    				printf("web %d:",i);
    				for(int k=0;k<=500;k++){
    					if(nvr[k])
    					printf(" %d",k);
    				}
    				printf("
    ");
    			}
    		}
    		printf("total: %d
    ",ans_cnt);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    iOS 开发中的坑与相关技巧
    SDK 封装的相关看法
    线程问题---在iPad上会崩溃,在iPhone上不会崩溃
    添加新手引导页需要注意的几个小点
    iOS 七牛云上传并获取图片----【客户端】
    iOS 线程相关-----绝对de干货
    Vue.js 基础示例
    lib-flexible 结合 WKWebView 的样式错乱解决方法
    基于CommentCoreLibrary简单的弹幕实现
    页面上动态编译及执行java代码
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4306658.html
Copyright © 2011-2022 走看看