bzoj1030[jsoi2007] Text Generator
Last Update:2016-07-24
Source: Internet
Author: User
<span id="Label3"></p><p><p><span style="font-size: x-large;"><span style="line-height: 36px;">bzoj1030[jsoi2007] Text Generator</span></span></p></p><p><p><span style="font-size: 14pt;">Test instructions</span></p></p><p><p>Give a dictionary and a length, asking how many strings of this length contain substrings as words in the dictionary. Both the string and the characters in the dictionary are uppercase Letters. Number of words ≤60, string and word length ≤100.</p></p><p><p><span style="font-size: 14pt;">Exercises</span></p></p><p><p>Run the DP on the AC automaton, not including the number of dictionary words, and then use the total number Minus. F[i][j] represents the current processing of the position i, the node on the trie is J. F[i][j]=sum{f[i+1][ch[x][k]]},x is the fail ancestor of j, which is the uppercase of K and cannot go to a node with Val 1. Note the processing of val, especially in the Getfail "if (val[ch[y][i])" val[ch[x][i]]=1; A sentence.</p></p><p><p><span style="font-size: 14pt;">Code:</span></p></p><pre><span style="color: #008080;"><span style="color: #008080;">1</span></span>#include <cstring><span style="color: #008080;"><span style="color: #008080;">2</span></span>#include <cstdio><span style="color: #008080;"><span style="color: #008080;">3</span></span>#include <algorithm><span style="color: #008080;"><span style="color: #008080;">4</span></span>#include <queue><span style="color: #008080;"><span style="color: #008080;">5</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">#define</span></span>MAXN 10000<span style="color: #008080;"><span style="color: #008080;">6</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">#define</span></span>Inc (i,j,k) for (int I=j;i<=k;i++)<span style="color: #008080;"><span style="color: #008080;">7</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">#define</span></span>MoD 10007<span style="color: #008080;"><span style="color: #008080;">8</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">using</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">namespace</span></span><span style="color: #000000;"><span style="color: #000000;">std;</span></span><span style="color: #008080;"><span style="color: #008080;">9</span></span> <span style="color: #008080;"><span style="color: #008080;">Ten</span></span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>n,m,sz,ch[maxn][<span style="color: #800080;"><span style="color: #800080;"></span> -</span>],fail[maxn],ans,f[<span style="color: #800080;"><span style="color: #800080;"></span> max</span>][maxn];<span style="color: #0000ff;"><span style="color: #0000ff;">BOOL</span></span><span style="color: #000000;"><span style="color: #000000;">val[maxn];</span></span><span style="color: #008080;"><span style="color: #008080;"></span> one</span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span>Insert<span style="color: #0000ff;"><span style="color: #0000ff;">Char</span></span>*<span style="color: #000000;"><span style="color: #000000;">S) {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> a</span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>x=<span style="color: #800080;"><span style="color: #800080;">0</span></span>, Len=strlen (s+<span style="color: #800080;"><span style="color: #800080;">1</span></span>); Inc (i,<span style="color: #800080;"><span style="color: #800080;">1</span></span>, Len) {<span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!ch[x][s[i]-<span style="color: #800000;"><span style="color: #800000;">'</span></span><span style="color: #800000;"><span style="color: #800000;">A</span></span><span style="color: #800000;"><span style="color: #800000;">'</span></span>]) ch[x][s[i]-<span style="color: #800000;"><span style="color: #800000;">'</span></span><span style="color: #800000;"><span style="color: #800000;">A</span></span><span style="color: #800000;"><span style="color: #800000;">'</span></span>]=++sz; x=ch[x][s[i]-<span style="color: #800000;"><span style="color: #800000;">'</span></span><span style="color: #800000;"><span style="color: #800000;">A</span></span><span style="color: #800000;"><span style="color: #800000;">'</span></span><span style="color: #000000;"><span style="color: #000000;">];}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>val[x]=<span style="color: #800080;"><span style="color: #800080;">1</span></span><span style="color: #000000;"><span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span>Queue <<span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>><span style="color: #000000;"><span style="color: #000000;">q;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">void</span></span><span style="color: #000000;"><span style="color: #000000;">getfail () {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>Inc (i,<span style="color: #800080;"><span style="color: #800080;">0</span></span>,<span style="color: #800080;"><span style="color: #800080;"></span> -</span>)<span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(ch[<span style="color: #800080;"><span style="color: #800080;">0</span></span>][i]) Q.push (ch[<span style="color: #800080;"><span style="color: #800080;">0</span></span>][i]), fail[ch[<span style="color: #800080;"><span style="color: #800080;">0</span></span>][i]]=<span style="color: #800080;"><span style="color: #800080;">0</span></span><span style="color: #000000;"><span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;"></span> while</span>(!<span style="color: #000000;"><span style="color: #000000;">Q.empty ()) {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>x=<span style="color: #000000;"><span style="color: #000000;">q.front (); q.pop ();</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>Inc (i,<span style="color: #800080;"><span style="color: #800080;">0</span></span>,<span style="color: #800080;"><span style="color: #800080;"></span> -</span>)<span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span><span style="color: #000000;"><span style="color: #000000;">(ch[x][i]) {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>y=fail[x];<span style="color: #0000ff;"><span style="color: #0000ff;"></span> while</span>(y&&!ch[y][i]) y=fail[y];<span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(ch[y][i]) fail[ch[x][i]]=<span style="color: #000000;"><span style="color: #000000;">ch[y][i];</span></span><span style="color: #008080;"><span style="color: #008080;"></span> a</span> <span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(val[ch[y][i]]) val[ch[x][i]]=<span style="color: #800080;"><span style="color: #800080;">1</span></span><span style="color: #000000;"><span style="color: #000000;">; Q.push (ch[x][i]);</span></span><span style="color: #008080;"><span style="color: #008080;"></span> at</span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;">}</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">Char</span></span>str[<span style="color: #800080;"><span style="color: #800080;"></span> max</span><span style="color: #000000;"><span style="color: #000000;">];</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span><span style="color: #000000;"><span style="color: #000000;">main () {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>scanf<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">%d%d</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span>, &n,&m); Inc (i,<span style="color: #800080;"><span style="color: #800080;">1</span></span>, N) scanf (<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">%s</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span>, str+<span style="color: #800080;"><span style="color: #800080;">1</span></span>), Insert (str); ans=<span style="color: #800080;"><span style="color: #800080;">1</span></span><span style="color: #000000;"><span style="color: #000000;">; Getfail ();</span></span><span style="color: #008080;"><span style="color: #008080;"></span> in</span>Inc (i,<span style="color: #800080;"><span style="color: #800080;">1</span></span>, M) ans=ans*<span style="color: #800080;"><span style="color: #800080;"></span> -</span>%mod; f[<span style="color: #800080;"><span style="color: #800080;">0</span></span>][<span style="color: #800080;"><span style="color: #800080;">0</span></span>]=<span style="color: #800080;"><span style="color: #800080;">1</span></span><span style="color: #000000;"><span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>Inc (i,<span style="color: #800080;"><span style="color: #800080;">1</span></span>, M) Inc (j,<span style="color: #800080;"><span style="color: #800080;">0</span></span>, Sz)<span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!val[j]&&f[i-<span style="color: #800080;"><span style="color: #800080;">1</span></span><span style="color: #000000;"><span style="color: #000000;">][j]) {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> to</span>Inc (k,<span style="color: #800080;"><span style="color: #800080;">0</span></span>,<span style="color: #800080;"><span style="color: #800080;"></span> -</span><span style="color: #000000;"><span style="color: #000000;">){</span></span><span style="color: #008080;"><span style="color: #008080;"></span> +</span> <span style="color: #0000ff;"><span style="color: #0000ff;">int</span></span>x=j;<span style="color: #0000ff;"><span style="color: #0000ff;"></span> while</span>(x&&!ch[x][k]) x=fail[x]; f[i][ch[x][k]]= (f[i][ch[x][k]]+f[i-<span style="color: #800080;"><span style="color: #800080;">1</span></span>][j])%<span style="color: #000000;"><span style="color: #000000;">mod;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;"></span> *</span>Inc (i,<span style="color: #800080;"><span style="color: #800080;">0</span></span>, Sz)<span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(!<span style="color: #000000;"><span style="color: #000000;">val[i]) {</span></span><span style="color: #008080;"><span style="color: #008080;"></span> $</span>ans= (ans-f[m][i])%mod;<span style="color: #0000ff;"><span style="color: #0000ff;">if</span></span>(ans<<span style="color: #800080;"><span style="color: #800080;">0</span></span>) ans+=<span style="color: #000000;"><span style="color: #000000;">mod;</span></span><span style="color: #008080;"><span style="color: #008080;">Panax Notoginseng</span></span> <span style="color: #000000;"><span style="color: #000000;"> }</span></span><span style="color: #008080;"><span style="color: #008080;"></span> -</span>printf<span style="color: #800000;"><span style="color: #800000;">"</span></span><span style="color: #800000;"><span style="color: #800000;">%d</span></span><span style="color: #800000;"><span style="color: #800000;">"</span></span>, ans);<span style="color: #0000ff;"><span style="color: #0000ff;">return</span></span> <span style="color: #800080;"><span style="color: #800080;">0</span></span><span style="color: #000000;"><span style="color: #000000;">;</span></span><span style="color: #008080;"><span style="color: #008080;"></span> the</span>}</pre><p><p></p></p><p style="text-align: right;"><p style="text-align: right;">20160621</p></p><p><p>bzoj1030[jsoi2007] Text Generator</p></p></span>