1 条题解
-
0
思路
26字母上统计长度M的安全文本并以26^M减去,终止沿fail传播,重复/包含词不重复计数;最多6000字符模式、M100,模10007。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; int main(){ios::sync_with_stdio(false);cin.tie(nullptr);const int MOD=10007;int n,m;cin>>n>>m;vector<array<int,26>>g(1);vector<int>f(1),bad(1);while(n--){string s;cin>>s;int v=0;for(char c:s){int x=c-'A';if(!g[v][x]){int id=g.size();g[v][x]=id;g.push_back({});f.push_back(0);bad.push_back(0);}v=g[v][x];}bad[v]=1;}queue<int>q;for(int x=0;x<26;x++)if(g[0][x])q.push(g[0][x]);while(!q.empty()){int v=q.front();q.pop();bad[v]|=bad[f[v]];for(int x=0;x<26;x++)if(g[v][x]){int u=g[v][x];f[u]=g[f[v]][x];q.push(u);}else g[v][x]=g[f[v]][x];}vector<int>dp(g.size()),next(g.size());dp[0]=1;int total=1;while(m--){fill(next.begin(),next.end(),0);for(int v=0;v<(int)g.size();v++)if(dp[v])for(int x=0;x<26;x++){int u=g[v][x];if(!bad[u])next[u]=(next[u]+dp[v])%MOD;}dp.swap(next);total=total*26%MOD;}int avoid=0;for(int x:dp)avoid=(avoid+x)%MOD;cout<<(total-avoid+MOD)%MOD<<'\n';}
- 1