zoukankan      html  css  js  c++  java
  • 【BZOJ5337】【TJOI2018】—STR(后缀自动机+dp)

    传送门

    既然是问一堆串拼出一个串的子串的方案数,那显然是要在这个串的SamSamdpdp

    考虑f[i][j]f[i][j]表示前ii个匹配串,匹配到jj的方案数
    则可以暴力枚举自动机上的点看能不能从这个点开始匹配完一个串
    可以的话就转移
    复杂度O(Slenai)O(S*sum |len_{a_i}|)

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    inline int read(){
    	char ch=getchar();
    	int res=0,f=1;
    	while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
    	while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();
    	return res*f;
    }
    const int N=20005;
    const ll mod=1e9+7;
    int A[N],B[N],k,n,link[N],siz[N],len[N],tot,last;
    map<int,int>nxt[N];
    char s[N],ch[N];
    ll f[105][N],ans;
    inline void sa_extend(int c){
    	int cur=++tot,p=last;
    	len[cur]=len[p]+1,siz[cur]=1;
    	for(;p&&!nxt[p][c];p=link[p])nxt[p][c]=cur;
    	if(!p)link[cur]=1;
    	else {
    		int q=nxt[p][c];
    		if(len[q]==len[p]+1)link[cur]=q;
    		else{
    			int clo=++tot;
    			len[clo]=len[p]+1,link[clo]=link[q];
    			nxt[clo]=nxt[q];
    			for(;p&&nxt[p][c]==q;p=link[p])nxt[p][c]=clo;
    			link[q]=link[cur]=clo;
    		}
    	}
    	last=cur;
    }
    int main(){
    	last=tot=1;
    	k=read();
    	scanf("%s",s);
    	int ln=strlen(s);
    	for(int i=0;i<ln;i++)sa_extend(s[i]-'A');
    	for(int i=1;i<=tot;i++)A[len[i]]++;
    	for(int i=1;i<=tot;i++)A[i]+=A[i-1];
    	for(int i=1;i<=tot;i++)B[A[len[i]]--]=i;
    	for(int i=tot;i>=1;i--)siz[link[B[i]]]+=siz[B[i]];
    	f[0][1]=1;
    	for(int i=1;i<=k;i++){
    		int T=read();
    		while(T--){
    			scanf("%s",s);
    			ln=strlen(s);
    			for(int p=1;p<=tot;p++){
    				if(f[i-1][p]==0)continue;
    				int now=p;
    				for(int j=0;j<ln;j++){
    					if(!nxt[now][s[j]-'A']){
    						now=-1;break;
    					}
    					else now=nxt[now][s[j]-'A'];
    				}
    				if(now!=-1)(f[i][now]+=f[i-1][p])%=mod;
    			}
    		}
    	}
    	for(int i=1;i<=tot;i++){
    		(ans+=1ll*siz[i]*f[k][i])%=mod;
    	}
    	cout<<ans<<'
    ';
    }
    
  • 相关阅读:
    Bash基本语法
    安装Ifconfig
    Centos6版本升级
    使用Lombok简化你的代码
    二、快速起步(Mysql镜像)
    一、Docker之旅
    logback.xml日志配置
    mybatis动态SQL标签的用法
    你不知道的Java类
    系统管理员需知的 16 个 iptables 使用技巧
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/11145650.html
Copyright © 2011-2022 走看看