zoukankan      html  css  js  c++  java
  • 【刷题】BZOJ 2780 [Spoj]8093 Sevenk Love Oimaster

    Description

    Oimaster and sevenk love each other.

    But recently,sevenk heard that a girl named ChuYuXun was dating with oimaster. As a woman's nature, s

    evenk felt angry and began to check oimaster's online talk with ChuYuXun. Oimaster talked with Ch

    uYuXun n times, and each online talk actually is a string.Sevenk asks q questions like this, "how

    many strings in oimaster's online talk contain this string as their substrings?"

    有n个大串和m个询问,每次给出一个字符串s询问在多少个大串中出现过

    Input

    There are two integers in the first line,

    the number of strings n and the number of questions q.

    And n lines follow, each of them is a string describing oimaster's online talk.

    And q lines follow, each of them is a question.

    n<=10000, q<=60000

    the total length of n strings<=100000,

    the total length of q question strings<=360000

    Output

    For each question, output the answer in one line.

    Sample Input

    3 3  
    abcabcabc  
    aaa  
    aafe  
    abc  
    a  
    ca
    

    Sample Output

    1  
    3  
    1
    

    Solution

    建个广义SAM,把每个串出现的节点的 (cnt)(1)

    对于询问,将询问串先匹配,匹配完后的节点的 (cnt) 就是答案

    标准广义太难写了,写了个山寨的

    #include<bits/stdc++.h>
    #define ui unsigned int
    #define ll long long
    #define db double
    #define ld long double
    #define ull unsigned long long
    const int MAXN=10000+10,MAXS=100000+10;
    int n,q,len[MAXS<<1],ch[MAXS<<1][30],fa[MAXS<<1],cnt[MAXS<<1],las=1,tot=1,vis[MAXS<<1];
    std::string s[MAXN];
    template<typename T> inline void read(T &x)
    {
    	T data=0,w=1;
    	char ch=0;
    	while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
    	if(ch=='-')w=-1,ch=getchar();
    	while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
    	x=data*w;
    }
    template<typename T> inline void write(T x,char ch='')
    {
    	if(x<0)putchar('-'),x=-x;
    	if(x>9)write(x/10);
    	putchar(x%10+'0');
    	if(ch!='')putchar(ch);
    }
    template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
    template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
    template<typename T> inline T min(T x,T y){return x<y?x:y;}
    template<typename T> inline T max(T x,T y){return x>y?x:y;}
    inline void extend(int c)
    {
    	int p=las,np=++tot;
    	las=np;
    	len[np]=len[p]+1;
    	while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];
    	if(!p)fa[np]=1;
    	else
    	{
    		int q=ch[p][c];
    		if(len[q]==len[p]+1)fa[np]=q;
    		else
    		{
    			int nq=++tot;
    			fa[nq]=fa[q];
    			memcpy(ch[nq],ch[q],sizeof(ch[nq]));
    			len[nq]=len[p]+1;fa[q]=fa[np]=nq;
    			while(p&&ch[p][c]==q)ch[p][c]=nq,p=fa[p];
    		}
    	}
    }
    int main()
    {
    	std::ios::sync_with_stdio(false);
    	std::cin>>n>>q;
    	for(register int i=1;i<=n;++i)
    	{
    		std::cin>>s[i];las=1;
    		for(register int j=0,lt=s[i].length();j<lt;++j)extend(s[i][j]-'a'+1);
    	}
    	for(register int i=1;i<=n;++i)
    	{
    		int u=1;
    		for(register int j=0,lt=s[i].length();j<lt;++j)
    		{
    			u=ch[u][s[i][j]-'a'+1];
    			for(register int v=u;v&&vis[v]^i;v=fa[v])vis[v]=i,cnt[v]++;
    		}
    	}
    	while(q--)
    	{
    		std::string p;std::cin>>p;
    		int u=1;
    		for(register int i=0,lt=p.length();i<lt;u=ch[u][p[i]-'a'+1],++i);
    		write(cnt[u],'
    ');
    	}
    	return 0;
    }
    
  • 相关阅读:
    P4374 [USACO18OPEN]Disruption P
    POJ
    Git
    SpringBoot集成RabbitMQ
    GIS类型文件剖析
    SpringBoot全局异常处理
    SpringCloud Feign异常处理
    SpringBoot注解
    Restful风格接口定义
    LOD技术的理解
  • 原文地址:https://www.cnblogs.com/hongyj/p/9285881.html
Copyright © 2011-2022 走看看