hdu5510_Bazinga_(剪枝+kmp)
来源:互联网 发布:ruby windows 编辑:程序博客网 时间:2024/06/04 19:09
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5510
题意:
给你t组数,每组n个串,让你找到最后一个串满足,在此串之前的串中有不是此串的子串。
解题思路:
这题呢,一开始用暴力做,过不了。。。
后来进行一个剪枝,判断第i个串之前的i-1个串中,存在的不是1-(i-1)的串中的子串是不是第i个串的子串,是的话标记掉,不是则更新结果为i。
代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cstdlib>using namespace std;int a[505];int flag;int pl,sl;char p[505][2005];int next1[505];int sum;void get_next(int p1){ pl=strlen(p[p1]); int k=-1,j=0; next1[0]=-1; while(j<pl) { if(k==-1||p[p1][j]==p[p1][k]) { j++;k++; next1[j]=k; } else k=next1[k]; }}int KMP(int s,int p1){ sum=0; sl=strlen(p[s]); int i=0,j=0; get_next(p1); while(j<pl&&i<sl) { if(j==-1||p[s][i]==p[p1][j]) { i++;j++; } else j=next1[j]; if(j==pl) { sum++;j=next1[j]; } } return sum;}int main(){ int t,n; scanf("%d",&t); int count=0; while(t--) { sum=0;flag=-1; memset(a,0,sizeof(a)); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%s",p[i]); } for(int i=0;i<n;i++) { for(int j=i-1;j>=0;j--) { if(a[j]==0) { if(KMP(i,j)==0){ flag=i+1; break; } else a[j]=1; } } } printf("Case #%d: %d\n",++count,flag); } return 0;}
阅读全文
0 0
- hdu5510_Bazinga_(剪枝+kmp)
- HDU 5510 Bazinga (kmp + 小剪枝)
- hdu5510 (KMP+剪枝)
- HDU5510 Bazinga KMP+剪枝
- qduoj kmp加剪枝
- HDU5510Bazinga(KMP+剪枝)
- 2015 ACM-ICPC Asia Regional Shenyang Bazinga(KMP+剪枝)
- hdu 5510 Bazinga(KMP+剪枝)
- hdu 5510 Bazinga【KMP+暴力剪枝】
- hdu 5510 Bazinga 剪枝+find()/strstr()/KMP
- poj_1011_sticks(搜索+剪枝)
- hdu1010(深搜 +剪枝)
- hdu4499(剪枝搜索)
- DFS(剪枝)_hdu_1010
- Friends(DFS+剪枝)
- hdu5113(dfs+剪枝)
- hdu1010(dfs+剪枝)
- poj 2362(剪枝)
- 遇到segment .ubsct size overflow的错误
- javascript高级程序教程中关于闭包与变量的问题
- 安卓自定义view绘制尺寸
- 机器学习中常用的矩阵求导公式
- java.lang.NoClassDefFoundError org/apache/commons/collections/FastHashMap
- hdu5510_Bazinga_(剪枝+kmp)
- Linux exec简介
- Html-行级标签
- CodeForces
- Linux netstat命令详解
- 走向云计算之Hadoop基本介绍及生态系统
- java培训第一天
- 计算机软件编程英语词汇集锦
- android binder机制,注册系统服务---Java层注册系统服务