必赢亚洲手机app下载


出品主管求职

入门指南

文件生成器

JSOI交给队员ZYX一个职责,编制一个称作“文本生成器”的电脑软件:该软件的使用者是一对幼稚人群,
他俩现在利用的是GW文本生成器v6版。该软件可以随心所欲生成一些篇章―――总是生成一篇长度固定且完全自由的文
章——
也就是说,生成的稿子中每个字节都是截然自由的。即使一篇随笔中至少含有使用者们询问的一个单词,
那就是说我们说那篇著作是可读的(我们称著作a包含单词b,当且仅当单词b是作品a的子串)。不过,即便如约这样的
规范,使用者现在应用的GW文本生成器v6版所生成的作品也是几乎完全不可读的?。ZYX需要指出GW文本生成器
v6
变更的拥有文件中可读文本的多少,以便可以得逞赢得v7更新版。你能匡助她吧?

Input

  输入文件的第一行包含四个正整数,分别是使用者掌握的单词总数N (<=
60),GW文本生成器 v6生成的文本固
电脑软件,定长度M;以下N行,每一行包含一个使用者精晓的单词。这里有着单词及文件的长短不会超过100,并且只可能包
含英文大写字母A..Z

Output

  一个平头,表示可能的篇章总数。只需要领悟结果模10007的值。

Sample Input

2 2
A
B

Sample Output

100

Hint

 

题解:

题目中应当很好想到ac自动机来缓解这道题,这里大家可以换一种思想格局,问明了的作品不好得出

结果,可以想有多少不认识的篇章,就是说,给定的单词一个都无法冒出。就是说就算该单词有就认

识,那么单词都要躲开。

f[i][j]表示到了i这一位,总共m个,即长度,然后,到了j这多少个点,可以赢得的方案数。

那就是说就需要在成立Trie图的时候处理一下。

电脑软件 1

看那些垃圾图,x,y,z点,y指向z,z为标志节点,因为z为y的后缀

据此y包涵z,y也是不和法的,所以y也亟需标记为不可到达。

下一场就是变换了,复杂度能够压过。

 1 #include<cstring>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdio>
 6 #include<queue>
 7 #define mod 10007
 8 using namespace std;
 9 
10 int n,m,ans=1,res,cnt=1,f[107][6007];
11 struct Node
12 {
13     int c[26],suf;
14     bool flag;
15 }trie[6007];
16 char ch[107];
17 
18 void insert()
19 {
20     int now=1,len=strlen(ch);
21     for (int i=0;i<len;i++)
22     {
23         if (!trie[now].c[ch[i]-'A']) trie[now].c[ch[i]-'A']=++cnt;
24         now=trie[now].c[ch[i]-'A'];
25     }
26     trie[now].flag=true;
27 }
28 void make_AC()
29 {
30     for (int i=0;i<26;i++)
31         trie[0].c[i]=1;
32     queue<int>q;while(!q.empty()) q.pop();
33     trie[1].suf=0;
34     q.push(1);
35     while(!q.empty())
36     {
37         int u=q.front();q.pop();
38         for (int i=0;i<26;i++)
39             if (trie[u].c[i])
40             {
41                 trie[trie[u].c[i]].suf=trie[trie[u].suf].c[i];
42                 if (trie[trie[trie[u].c[i]].suf].flag) trie[trie[u].c[i]].flag=true;
43                 q.push(trie[u].c[i]);
44             }
45             else trie[u].c[i]=trie[trie[u].suf].c[i];
46     }
47 }
48 inline void dp(int x)
49 {
50     for (int i=1;i<=cnt;i++)
51     {
52         if (trie[i].flag||f[x-1][i]==0) continue;
53         for (int j=0;j<26;j++)
54             f[x][trie[i].c[j]]=(f[x][trie[i].c[j]]+f[x-1][i])%mod;
55     }
56 }
57 int main()
58 {
59     scanf("%d%d",&n,&m);
60     for (int i=1;i<=n;i++)
61     {
62         scanf("%s",ch);
63         insert();
64     }
65     make_AC();
66     f[0][1]=1;
67     for (int i=1;i<=m;i++) dp(i);
68     for (int i=1;i<=m;i++)
69         ans=(ans*26)%mod;    
70     for (int i=1;i<=cnt;i++)
71         if (trie[i].flag==0) res=(res+f[m][i])%mod;
72     printf("%d\n",(ans-res+mod)%mod);     
73 }

 

相关文章

No Comments, Be The First!
近期评论
    功能
    网站地图xml地图