zoukankan      html  css  js  c++  java
  • bzoj 2780 [Spoj]8093 Sevenk Love Oimaster

    LINK:Sevenk Love Oimaster

    询问一个模式串在多少个文本串中出现过。

    考虑广义SAM 统计这种数量问题一般有三种做法。

    一种 暴力bitset 这道题可能可以过?

    一种 暴力跳parent 复杂度多乘根号。

    一种 线段树合并 乘个log.

    最简便的 不容易T的首选第二种方法。

    const int MAXN=100010<<1;
    int n,m;
    int last=1,cnt=1;
    int vis[MAXN],sum[MAXN];
    char a[MAXN];
    struct wy
    {
    	int ch[26];
    	int fa,len;
    }t[MAXN];
    inline int insert(int x)
    {
    	int p=last;
    	if(t[p].ch[x])
    	{
    		int q=t[p].ch[x];
    		if(len(q)==len(p)+1)return last=q;
    		int nq=++cnt;
    		t[nq]=t[q];
    		vis[nq]=vis[q];sum[nq]=sum[q];
    		len(nq)=len(p)+1;
    		f(q)=nq;
    		while(p&&t[p].ch[x]==q)
    		{
    			t[p].ch[x]=nq;
    			p=f(p);
    		}
    		return last=nq;
    	}
    	int np=last=++cnt;
    	len(np)=len(p)+1;
    	while(p&&!t[p].ch[x])
    	{
    		t[p].ch[x]=np;
    		p=f(p);
    	}
    	if(!p)f(np)=1;
    	else
    	{
    		int q=t[p].ch[x];
    		if(len(q)==len(p)+1)f(np)=q;
    		else
    		{
    			int nq=++cnt;
    			t[nq]=t[q];
    			len(nq)=len(p)+1;
    			f(np)=f(q)=nq;
    			vis[nq]=vis[q];sum[nq]=sum[q];
    			while(p&&t[p].ch[x]==q)
    			{
    				t[p].ch[x]=nq;
    				p=f(p);
    			}
    		}
    	}
    	return last;
    }
    int main()
    {
    	freopen("1.in","r",stdin);
    	gt(n);gt(m);
    	rep(1,n,i)
    	{
    		gc(a);last=1;
    		int len=strlen(a+1);
    		rep(1,len,j)
    		{
    			insert(a[j]-'a');
    			int w=last;
    			while(w&&vis[w]!=i)vis[w]=i,++sum[w],w=f(w);
    		}
    	}
    	rep(1,m,i)
    	{
    		gc(a);int p=1;
    		int len=strlen(a+1);
    		rep(1,len,j)p=t[p].ch[a[j]-'a'];
    		put(sum[p]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    阿狸的打字机(bzoj 2434)
    Censoring(bzoj 3940)
    文本生成器(bzoj 1030)
    病毒(bzoj 2938)
    Road(bzoj 2750)
    codevs 2370 小机房的树
    HDU 2838 Cow Sorting
    luogu P2253 好一个一中腰鼓!
    hdu 1166 敌兵布阵
    luogu P1901 发射站
  • 原文地址:https://www.cnblogs.com/chdy/p/12551126.html
Copyright © 2011-2022 走看看