学习oi两年半,悬关AC自动机WA求助
查看原帖
学习oi两年半,悬关AC自动机WA求助
352426
就决定是你辣楼主2023/5/29 18:51

rt,调一天了,帮帮萌新/kk

#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
const int maxn=1e6+10;
int t[maxn][26];
int sum[maxn];
int fl[maxn];
int wr[maxn];
int tot;
void insert(string s){
    int u=0;
    int n=s.length();
    for(int i=0;i<n;i++){
        int k=s[i]-'A';
        if(!t[u][k]){
            t[u][k]=++tot;
        }
        u=t[u][k];
    }
    wr[u]=1;
}
int f[105][6666];
void build(){
    queue<int>q;
    for(int i=0;i<26;i++){
        if(t[0][i])q.push(t[0][i]);
    }
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=0;i<26;i++){
            if(t[u][i]){
                fl[t[u][i]]=t[fl[u]][i];q.push(t[u][i]);
                wr[t[u][i]]=wr[fl[t[u][i]]];
            }
            else t[u][i]=t[fl[u]][i];
        }
    }
}
const int mod=1e4+7;
int qpow(int a,int b){
    int ans=1;
    for(;b;b>>=1,a=a*a%mod) if(b&1) ans=ans*a%mod;
    return ans;
}
int main(){
    
    int n=read(),m=read();
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        insert(s);
    }
    build();
    f[0][0]=1;
    for(int i=0;i<m;i++){
    	for(int j=0;j<=tot;j++){
    		for(int k=0;k<26;k++){
    			if(!wr[t[j][k]]) f[i+1][t[j][k]]=(f[i+1][t[j][k]]+f[i][j])%mod;
			}
		}
	}
	int ans=qpow(26,m);
	for(int i=0;i<=tot;i++) ans=(ans-f[m][i]+mod)%mod;
	cout<<ans<<endl;
}
2023/5/29 18:51
加载中...