蛋碎了,开始理解错题意的,以为跟上个题一样要替换。。。然后发现删除我不会啊,然后听宝哥讲了讲转移过程后,也不算难理解,主要是被前面的题给局限住思维了。
然后就是漫长的debug过程,手动构造数据,构造的我心碎了,最后看别人代码才发现错误,别人的代码实现方式和我明显不是一个风格的,我看的也很纠结啊。。。
在AC自动机构造关系的时候,开始只注意了-999的转移,然后慢慢debug后+上权值的转移,最后才发现999串的转移也要有,折腾了一天,终于过了。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define N 2000 9 #define INF 10000000 10 int t; 11 int trie[N][26]; 12 int o[N]; 13 int que[N]; 14 int flag[N]; 15 int fail[N]; 16 int wa[N]; 17 int dp1[N][256]; 18 int dp2[N][256]; 19 int goal1[N][256]; 20 int goal2[N][256]; 21 int num; 22 void CL() 23 { 24 num = 0; 25 memset(trie,-1,sizeof(trie)); 26 memset(o,0,sizeof(o)); 27 memset(flag,0,sizeof(flag)); 28 memset(wa,0,sizeof(flag)); 29 t = 1; 30 } 31 void insert(char *str,int x) 32 { 33 int i,root,len,sum; 34 root = 0; 35 len = strlen(str); 36 sum = 0; 37 for(i = 0; i < len; i ++) 38 { 39 if(trie[root][str[i]-'a'] == -1) 40 trie[root][str[i]-'a'] = t ++; 41 root = trie[root][str[i]-'a']; 42 } 43 if(x == 999) 44 { 45 flag[root] = 1< dp1[j][k] + 1)129 {130 dp2[j][k] = dp1[j][k] + 1;131 goal2[j][k] = goal1[j][k];132 }133 else if(dp2[j][k] == dp1[j][k] + 1)134 {135 goal2[j][k] = max(goal2[j][k],goal1[j][k]);136 }137 int c = str[i] - 'a';138 if(wa[trie[j][c]]) continue;139 int temp,val;140 temp = k|flag[trie[j][c]];141 val = o[trie[j][c]];142 if(dp2[trie[j][c]][temp] > dp1[j][k])143 {144 dp2[trie[j][c]][temp] = dp1[j][k];145 goal2[trie[j][c]][temp] = goal1[j][k] + val;146 }147 else if(dp2[trie[j][c]][temp] == dp1[j][k])148 {149 goal2[trie[j][c]][temp] = max(goal2[trie[j][c]][temp],goal1[j][k] + val);150 }151 }152 }153 for(j = 0; j <= t; j ++)154 {155 for(k = 0; k < (1< dp1[i][(1< = INF)178 printf("Case %d: Banned\n",cas++);179 else180 printf("Case %d: %d %d\n",cas++,ans1,ans2);181 }182 return 0;183 }184 /*185 9186 3187 abdc 2188 bd 3189 c 4190 abdc191 3192 aba 999193 a 6194 ab 5195 aba196 3197 3198 ab -1199 bc -2200 d -3201 abcd202 */