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

    传送门

    看着就是裸的AC自动机是不是?会T一个点
    然而。。。为什么放过暴力KMP和暴力find,理论复杂度(O(nm))起步啊
    AC自动机加一个树上差分就好啦,对于每个字符串的查询,实际上都是在fail树上每个点到根的路径上+1
    fail树建出来就没了
    代码:

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    void read(int &x) {
    	char ch; bool ok;
    	for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
    	for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
    }
    #define rg register
    const int maxn=1e6+10;queue<int>q;
    int ed[201],fail[maxn],n,rt=1,id=1,ch[maxn][26],ans,vis[maxn],pre[maxn*2],nxt[maxn*2],h[maxn],cnt;char s[201][maxn];
    void add(int x,int y)
    {
    	pre[++cnt]=y,nxt[cnt]=h[x],h[x]=cnt;
    	pre[++cnt]=x,nxt[cnt]=h[y],h[y]=cnt;
    }
    void insert(char *s,int d)
    {
    	int len=strlen(s+1);rt=1;
    	for(rg int i=1;i<=len;i++)
    	{
    		int now=s[i]-'a';
    		if(!ch[rt][now])ch[rt][now]=++id;
    		rt=ch[rt][now];vis[rt]++;
    	}
    	ed[d]=rt;
    }
    void bfs()
    {
    	q.push(1);
    	while(!q.empty())
    	{
    		int x=q.front();q.pop();
    		for(rg int i=0;i<26;i++)
    		{
    			if(!ch[x][i]){ch[x][i]=fail[x]?ch[fail[x]][i]:1;continue;}
    			int j=fail[x],z=ch[x][i];q.push(z);
    			while(j&&!ch[j][i])j=fail[j];
    			if(j)fail[z]=ch[j][i],add(z,ch[j][i]);
    			else fail[z]=1,add(1,z);
    		}
    	}
    }
    void solve(int x,int fa)
    {
    	for(rg int i=h[x];i;i=nxt[i])
    		if(pre[i]!=fa)solve(pre[i],x),vis[x]+=vis[pre[i]];
    }
    int main()
    {
    	read(n);
    	for(rg int i=1;i<=n;i++)scanf("%s",s[i]+1),insert(s[i],i);
    	bfs();solve(1,0);
    	for(rg int i=1;i<=n;i++)printf("%d
    ",vis[ed[i]]);
    }
    
  • 相关阅读:
    LINUX安装NGINX
    CentOS 设置mysql的远程访问
    centos6 mysql 安装与配置
    php读取用友u8采购入库单列表及详细
    php读取用友u8客户档案
    深度linux没有ll等命令的解决办法
    CentOS7下FTP的安装与配置
    虚拟机CentOS6.5搭建samba服务器实现文件共享
    linux 查找php.ini在那个文件夹
    CBE引擎概览
  • 原文地址:https://www.cnblogs.com/lcxer/p/10432912.html
Copyright © 2011-2022 走看看