• BZOJ2780 [Spoj]8093 Sevenk Love Oimaster 【广义后缀自动机】


    题目

     Oimaster and sevenk love each other.
    
    But recently,sevenk heard that a girl named ChuYuXun was dating with oimaster.As a woman's nature, sevenk felt angry and began to check oimaster's online talk with ChuYuXun.    Oimaster talked with ChuYuXun 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?"
    

    输入格式

    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

    输出格式

    For each question, output the answer in one line.

    输入样例

    3 3

    abcabcabc

    aaa

    aafe

    abc

    a

    ca

    输出样例

    1

    3

    1

    题解

    广义后缀自动机裸题
    先建机,然后记录每个点所被包含的字符串的个数
    询问就按询问的字符串走到对应节点,输出该节点存在的字符串数

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<cstring>
    #include<algorithm>
    #define LL long long int
    #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
    #define REP(i,n) for (int i = 1; i <= (n); i++)
    #define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
    using namespace std;
    const int maxn = 200005,maxm = 400005,INF = 1000000000;
    inline int read(){
    	int out = 0,flag = 1; char c = getchar();
    	while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
    	while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
    	return out * flag;
    }
    int n;
    int ch[maxn][26],pre[maxn],step[maxn],cnt,last;
    int sz[maxn],vis[maxn];
    char ss[maxn >> 1];
    string s[10005];
    void ins(int x){
    	int p = last,np = ++cnt; step[np] = step[p] + 1; last = np;
    	while (p && !ch[p][x]) ch[p][x] = np,p = pre[p];
    	if (!p) pre[np] = 1;
    	else {
    		int q = ch[p][x];
    		if (step[q] == step[p] + 1) pre[np] = q;
    		else {
    			int nq = ++cnt; step[nq] = step[p] + 1;
    			for (int i = 0; i < 26; i++) ch[nq][i] = ch[q][i];
    			pre[nq] = pre[q]; pre[np] = pre[q] = nq;
    			while (ch[p][x] == q) ch[p][x] = nq,p = pre[p];
    		}
    	}
    }
    int main(){
    	n = read();
    	int q = read();
    	cnt = last = 1;
    	for (int i = 1; i <= n; i++){
    		last = 1;
    		scanf("%s",ss); int len = strlen(ss);
    		s[i] = (string)(ss);
    		for (int i = 0; i < len; i++) ins(ss[i] - 'a');
    	}
    	int u;
    	for (int i = 1; i <= n; i++){
    		u = 1;
    		for (unsigned int j = 0; j < s[i].length(); j++){
    			u = ch[u][s[i][j] - 'a'];
    			for (int p = u; p && vis[p] != i; p = pre[p])
    				sz[p]++,vis[p] = i;
    		}
    	}
    	while (q--){
    		scanf("%s",ss);
    		int len = strlen(ss),ans = 0;
    		u = 1;
    		for (int i = 0; i < len; i++){
    			if (!(u = ch[u][ss[i] - 'a'])) break;
    			if (i == len - 1) ans = sz[u];
    		}
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    菜鸟打印模板
    centos8安装nginx1.9.1
    centos8安装tomcat8.5
    构建微信公众号服务实例和小程序服务实例
    wxMpMenuService.menuGet()和wxMpMenuService.getSelfMenuInfo()返回值对比
    spring cloud 实现基于Nacos权重的负载均衡
    go开发环境搭建
    国内公共的DNS服务&Centos7 配置公共DNS服务
    Redis
    Spring Boot 集成 PageHelper
  • 原文地址:https://www.cnblogs.com/Mychael/p/8538736.html
Copyright © 2020-2023  润新知