[HDU 5510][2015ACM/ICPC 亚洲区沈阳站] Bazinga KMP+剪支
来源:互联网 发布:struct node什么意思 编辑:程序博客网 时间:2024/05/18 05:46
Bazinga
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 1597 Accepted Submission(s): 499
Problem Description
Ladies and gentlemen, please sit up straight.
Don’t tilt your head. I’m serious.
A substring of a string Si is another string that occurs in Si. For example, ruiz" is a substring of
ruizhang”, and rzhang" is not a substring of
ruizhang”.
Input
The first line contains an integer t (1≤t≤50) which is the number of test cases.
For each test case, the first line is the positive integer n (1≤n≤500) and in the following n lines list are the strings S1,S2,⋯,Sn.
All strings are given in lower-case letters and strings are no longer than 2000 letters.
Output
For each test case, output the largest label you get. If it does not exist, output −1.
Sample Input
4
5
ab
abc
zabc
abcd
zabcd
4
you
lovinyou
aboutlovinyou
allaboutlovinyou
5
de
def
abcd
abcde
abcdef
3
a
ba
ccc
Sample Output
Case #1: 4
Case #2: -1
Case #3: 4
Case #4: 3
Source
2015ACM/ICPC亚洲区沈阳站-重现赛
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510
题意:
一些字符串,问下标最大的字符串使得下标小于它的字符串中存在一个字符串不是它的子串(连续)
思路:
n^2+kmp肯定超时,剪支可吧被匹配上的串删掉,保证后面的能匹配上的(无所谓),!kmp的没被删去;满足条件的break掉搜下面串即可;
if(kmp(i,j)) vis[j]=1;else flag=1,ans=i,break;
代码:
#include<iostream>#include<stdio.h>#include<string.h>using namespace std;char s[502][2002];int flag;int vis[502];int ans;int nex[502][2002];void pre(char ss[],int id){ int j=-1; for(int i=0;ss[i];i++) { while(ss[i]!=ss[j+1]&&j!=-1) { j=nex[id][j]; } if(ss[i]==ss[j+1]&&i!=0) j++; nex[id][i]=j; }}bool kmp(int x,int y){ int j=-1; for(int i=0;s[x][i];i++) { while(s[x][i]!=s[y][j+1]&&j!=-1) j=nex[y][j]; if(s[x][i]==s[y][j+1]) j++; if(j==strlen(s[y])-1) return 1; } return 0;}int T,n;int main(){ scanf("%d",&T); int cnt=0; while(T--) { cnt++; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",s[i]); pre(s[i],i); vis[i]=0; } flag=0; for(int i=2;i<=n;i++) { for(int j=i-1;j>=1;j--) if(!vis[j]) { if(kmp(i,j)) { vis[j]=1; } else { flag=1; ans=i; break; } } } printf("Case #%d: ",cnt); if(flag) printf("%d\n",ans); else printf("-1\n"); }}
- [HDU 5510][2015ACM/ICPC 亚洲区沈阳站] Bazinga KMP+剪支
- HDU 5510 Bazinga(KMP)——2015ACM/ICPC亚洲区沈阳站
- HDU 5510 Bazinga 字符串HASH (2015ACM/ICPC亚洲区沈阳站)
- hdu 5510 Bazinga 2015ACM/ICPC亚洲区沈阳站现场赛
- hdu 5510 Bazinga 2015ACM/ICPC亚洲区沈阳站-重现赛
- 【hdu 5510】【2015ACM/ICPC亚洲区沈阳站-重现赛 】Bazinga 题意&题解&代码(C++)
- 2015ACM/ICPC亚洲区沈阳站 HDU
- HDU 5510(ACM 2015 沈阳)Bazinga [KMP]
- HDU-5510-Bazinga【2015沈阳赛区】【KMP】
- 【HDU 6228、2017ACM/ICPC亚洲区沈阳站】Tree
- 【HDU 6227 2017ACM/ICPC亚洲区沈阳站】Rabbits
- HDU 5510 Bazinga(2015亚洲区沈阳站现场赛)
- HDU 5510 Bazinga (2015沈阳站B题&&KMP)
- 2016ACM/ICPC亚洲区沈阳站
- 2017ACM/ICPC亚洲区沈阳站
- B-Bazinga(2015-ACM-ICPC沈阳站)
- 【解题报告】2015ACM/ICPC亚洲区沈阳站
- Pagodas --(hdu5512)2015ACM/ICPC亚洲区沈阳站
- UIDocumentInteractionController的使用之打开和预览文档
- java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException解决办法
- 虚拟与现实的距离——VR的2016正如移动互联网的2009【下篇】
- 第八周作业里遇到的问题
- max depth exceeded when dereferencing c0-param0的问题
- [HDU 5510][2015ACM/ICPC 亚洲区沈阳站] Bazinga KMP+剪支
- 面试题--什么是线程安全和线程不安全
- C# 基于StackExchange.Redis.dll利用Redis实现分布式Session
- 扫描手机上的应用 数据和APK源文件
- dns服务器的配置和解析
- Recovery Catalog
- grep与正则表达式基本知识
- [存储] 利用SharedPreferences保存账号密码
- Oracle SQL 内置函数大全()