HDU 5510 Bazinga(思维)
来源:互联网 发布:linux 通配符 编辑:程序博客网 时间:2024/06/05 08:38
题目大意:给你n个字符串,要求你找出符合1 < j <= n,且存在i < j,且i不是j的子集的最大的j
解题思路:这题我用dp将其相同的压缩起来,接着再从前往后找了一下
#include <cstdio>#include <cstring>const int N = 510;const int M = 2010;int next[N][M], len[N], dp[N];char str[N][M];int n, cas = 1; void init() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%s", str[i]); len[i] = strlen(str[i]); }}void getNext(int cur) { int i = 0, j = -1; next[cur][0] = -1; while (i < len[cur]) { if (j == -1 || str[cur][i] == str[cur][j]) { i++; j++; next[cur][i] = j; } else j = next[cur][j]; }}void solve() { for (int i = 1; i <= n; i++) getNext(i); memset(dp, -1, sizeof(dp)); dp[1] = 1; for (int i = 2; i <= n; i++) { bool flag = false; for (int j = i - 1; j ; j = dp[j] - 1) { bool ok = false; int k = 0, l = 0; while (l < len[i]) { if (k == -1 || str[j][k] == str[i][l]) { k++; l++; if (k == len[j]) { flag = ok = true; dp[i] = dp[j]; break; } } else k = next[j][k]; } if (!ok) break; } if (!flag) dp[i] = i; } for (int i = n; i >= 1; i--) { if (dp[i] != 1) { printf("Case #%d: %d\n", cas++, i); return ; } } printf("Case #%d: %d\n", cas++, -1);}int main() { int test; scanf("%d", &test); while (test--) { init(); solve(); } return 0;}
0 0
- HDU 5510 Bazinga(思维)
- hdu 5510Bazinga(kmp+思维)
- HDU 5510 Bazinga
- hdu 5510 -Bazinga(kmp)
- hdu 5510 Bazinga(kmp)
- HDU 5510 Bazinga 【strstr】
- HDU-5510 Bazinga
- HDU 5510 Bazinga 【kmp】
- HDU 5510 Bazinga(KMP)
- HDU 5510 Bazinga(kmp)
- hdu 5510 Bazinga(高效)
- HDU-5510 Bazinga(枚举+剪枝)
- HDU 5510 Bazinga (KMP)
- HDU 5510 Bazinga(KMP)
- HDU-5510 Bazinga(KMP)
- HDU 5510 Bazinga (KMP)
- hdu 5510 Bazinga(KMP+剪枝)
- HDU 5510 Bazinga 多种姿势
- HDU-5512 Pagodas(GCD)
- 数据结构实验一(1)
- Http Chunked Transfer Coding
- javaScript对象详解
- Java生产者消费者例子尝试
- HDU 5510 Bazinga(思维)
- 通过rsync+inotify实现服务器之间数据的实时备份
- Java学习心得(1)——强类型语言和布尔类型
- Ubuntu 14.04 安装Firefox的Flash插件
- 使用osm2pgsql工具将osm数据导入postgis中(图解)
- MySQL数据库基本操作
- 数据结构实验一(2)
- C++之旅<友元函数的注意事项>
- 大二专题第一周 E - Hyper Prefix Sets