zoukankan      html  css  js  c++  java
  • bzoj3172: [Tjoi2013]单词

    传送门:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3172

    思路:每加入一个串,就给这个串的路径上所有点的sum+1,表示它的前缀都又出现了一次,然后从下向上把sum加到fail指针指向的点上就可以得到答案了。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    const int maxn=1000010;
    using namespace std;
    int n,w[210];char s[maxn];
    
    struct AC_DFA{
    	int tot,ch[maxn][26],fail[maxn],q[maxn],head,tail,sum[maxn];
    	void insert(int &x){
    		int p=0;
    		int len=strlen(s);
    		for (int i=0;i<len;i++){
    			if (!ch[p][s[i]-'a']) ch[p][s[i]-'a']=++tot;
    			++sum[p=ch[p][s[i]-'a']];
    		}
    		x=p;
    	}
    	void getfail(){
    		head=0,q[tail=1],fail[0]=-1;
    		while (head!=tail){
    			int x=q[++head];
    			for (int i=0;i<26;i++){
    				if (ch[x][i]) q[++tail]=ch[x][i],fail[ch[x][i]]=x==0?0:ch[fail[x]][i];
    				else ch[x][i]=x==0?0:ch[fail[x]][i];
    			}
    		}
    	}
    	void work(){
    		for (int i=tail;i;i--) sum[fail[q[i]]]+=sum[q[i]];
    		for (int i=1;i<=n;i++) printf("%d
    ",sum[w[i]]);
    	}
    }T;
    
    int main(){
    	scanf("%d",&n);
    	for (int i=1;i<=n;i++) scanf("%s",s),T.insert(w[i]);
    	T.getfail(),T.work();
    	return 0;
    }


  • 相关阅读:
    zabbix:乱码问题
    zabbix--微信报警(未完成)
    ansible-playbook项目(4)
    ansible-playbook(3)
    备份和校验脚本-邮件通知
    rsync
    keepalived
    双机热备
    nginx负载均衡
    LNMP(5)
  • 原文地址:https://www.cnblogs.com/thythy/p/5493564.html
Copyright © 2011-2022 走看看