• 【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)


    【BZOJ2780】【SPOJ】Sevenk Love Oimaster(后缀自动机)

    题面

    BZOJ
    洛谷

    题解

    裸的广义后缀自动机???
    建立广义后缀自动机建立出来之后算一下每个节点被几个串给包括了
    然后读入串直接匹配就好了

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    #define ll long long
    #define RG register
    #define MAX 111111
    struct Node
    {
    	int son[26];
    	int ff,len;
    }t[MAX<<1];
    int last=1,tot=1;
    void extend(int c)
    {
    	int p=last,np=++tot;last=np;
    	t[np].len=t[p].len+1;
    	while(p&&!t[p].son[c])t[p].son[c]=np,p=t[p].ff;
    	if(!p)t[np].ff=1;
    	else
    	{
    		int q=t[p].son[c];
    		if(t[q].len==t[p].len+1)t[np].ff=q;
    		else
    		{
    			int nq=++tot;
    			t[nq]=t[q];t[nq].len=t[p].len+1;
    			t[q].ff=t[np].ff=nq;
    			while(p&&t[p].son[c]==q)t[p].son[c]=nq,p=t[p].ff;
    		}
    	}
    }
    string s[MAX],c;
    int n,m;
    int vis[MAX<<1],size[MAX<<1];
    int main()
    {
    	std::ios::sync_with_stdio(false);
    	cin>>n>>m;
    	for(int i=1;i<=n;++i,last=1)
    	{
    		cin>>s[i];
    		for(int j=0,l=s[i].length();j<l;++j)extend(s[i][j]-97);
    	}
    	for(int i=1;i<=n;++i)
    	{
    		int now=1;
    		for(int j=0,l=s[i].length();j<l;++j)
    		{
    			now=t[now].son[s[i][j]-97];
    			int u=now;
    			while(u&&vis[u]!=i)vis[u]=i,++size[u],u=t[u].ff;
    		}
    	}
    	for(int i=1;i<=m;++i)
    	{
    		cin>>c;
    		int now=1;
    		for(int j=0,l=c.length();j<l;++j)
    			now=t[now].son[c[j]-97];
    		printf("%d
    ",size[now]);
    	}
    	return 0;	
    }
    
    
  • 相关阅读:
    Java 过滤器
    理解Java中的弱引用(Weak Reference)
    AOP编程
    利用ThreadLocal管理事务
    Redis设计与实现-附加功能
    Redis设计与实现-主从、哨兵与集群
    Redis设计与实现-客户端服务端与事件
    Redis设计与实现-持久化篇
    Redis设计与实现-内部数据结构篇
    重温软件架构设计-程序员向架构师转型必备
  • 原文地址:https://www.cnblogs.com/cjyyb/p/8696355.html
Copyright © 2020-2023  润新知