zoukankan      html  css  js  c++  java
  • 【BZOJ1030】文本生成器(AC自动机,动态规划)

    【BZOJ1030】文本生成器(AC自动机,动态规划)

    题面

    BZOJ

    题解

    超级简单良心送分题
    很明显是所有状态-不合法状态
    合法状态就是(26^m)
    不合法状态做一个(dp)就好

    #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 MOD 10007
    inline int read()
    {
        RG int x=0,t=1;RG char ch=getchar();
        while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
        if(ch=='-')t=-1,ch=getchar();
        while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
        return x*t;
    }
    struct Node
    {
    	int vis[26];
    	int lt,fail;
    }t[10000];
    char ch[500];
    int tot,n,m;
    int f[120][7000];
    void insert(char *s)
    {
    	int now=0,len=strlen(s+1);
    	for(int i=1;i<=len;++i)
    	{
    		if(!t[now].vis[s[i]-'A'])
    			t[now].vis[s[i]-'A']=++tot;
    		now=t[now].vis[s[i]-'A'];
    	}
    	t[now].lt=1;
    }
    void GetFail()
    {
    	queue<int> Q;
    	for(int i=0;i<26;++i)
    		if(t[0].vis[i])Q.push(t[0].vis[i]);
    	while(!Q.empty())
    	{
    		int u=Q.front();Q.pop();
    		t[u].lt|=t[t[u].fail].lt;
    		for(int i=0;i<26;++i)
    			if(t[u].vis[i])
    				t[t[u].vis[i]].fail=t[t[u].fail].vis[i],Q.push(t[u].vis[i]);
    			else
    				t[u].vis[i]=t[t[u].fail].vis[i];
    	}
    }
    int fpow(int a,int b)
    {
    	int s=1;
    	while(b){if(b&1)s=s*a%MOD;a=a*a%MOD;b>>=1;}
    	return s;
    }
    int main()
    {
    	n=read();m=read();
    	for(int i=1;i<=n;++i)
    	{
    		scanf("%s",ch+1);
    		insert(ch);
    	}
    	GetFail();
    	int ans=fpow(26,m);
    	f[0][0]=1;
    	for(int i=1;i<=m;++i)
    		for(int j=0;j<=tot;++j)
    			for(int k=0;k<26;++k)
    				if(!t[t[j].vis[k]].lt)
    					(f[i][t[j].vis[k]]+=f[i-1][j])%=MOD;
    	for(int i=0;i<=tot;++i)ans=(ans-f[m][i]+MOD)%MOD;
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    HCTF2018-admin
    SUCTF 2019-EasySQL
    BUUCTF-WEB-easy_tornado
    黑客攻防技术宝典web实战篇:攻击数据存储区习题
    可持久化数据结构·主席树(静态)
    Luogu P2661 [NOIP2015] 信息传递
    Luogu P2700 逐个击破
    Luogu P4779 【模板】单源最短路径(标准版)(Dijkstra+堆优化模板)
    Luogu P1962 斐波那契数列(矩阵乘法模板)
    Luogu P3366 【模板】最小生成树
  • 原文地址:https://www.cnblogs.com/cjyyb/p/8435817.html
Copyright © 2011-2022 走看看