【HDU 5510 Bazinga】字符串
2015沈阳区域赛现场赛第2题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510
题意:给定一个由字符串组成的序列,一共n个元素,每个元素是一个不超过2000个字符的字符串。求"存在秩小于 i 且不是 i 的子串"的最大的 i (1<= i <= n)。
数据范围:n [1, 500],T组输入,T [1, 50]
思路:从1到n-1枚举每个字符串str[i],判断是否有 j < i 使得str[j]不是str[i]的子串,若有,将 i 标记为当前最优解。枚举结束后最后标记的 i 即为所求;若始终未标记,则不存在,输出-1。
串匹配用了KMP,对同一模式串的next数组只在需要的时候生成一遍,再次需要时直接取用。
另外,开辟一个vis数组记录子串关系以省略一些匹配。即当判断出 str[i] 是 str[j] 的子串时(i < j), 意味着有比 i 秩更大的串 str[j] 包含了 str[i],那么只匹配str[j]就可以了,对str[i]的匹配是不必要的了,因此标记vis[i]=1以区分。
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N = ;
const int MAX_L = ; int T;
int n;
char str[MAX_N][MAX_L];
int len[MAX_N];
int next[MAX_N][MAX_L]; char has_cal[MAX_N];//是否已计算
char vis[MAX_N];//是否存在秩更大的母串 int Index_KMP(int s, int t, int pos, int next[]){
//下标从1开始,[0]无意义
int i=pos, j=;
char* S = str[s];
char* T = str[t];
while(i<=len[s] && j<=len[t]){
if(j== || S[i]==T[j]){i++; j++;}
else j=next[j];
}
if(j>len[t]) return i-len[t];
else return ;
} void get_next(int t, int* next){
int i=, j=;
char* T = str[t];
int lt = len[t];
next[] = next[] = ;
while(i<lt){
if(j== || T[i]==T[j]){next[++i] = ++j;}
else j=next[j];
}
} int main()
{
freopen("5510.txt", "r", stdin);
scanf("%d", &T);
for(int ca = ; ca<=T; ca++){ scanf("%d", &n);
for(int i=; i<n; i++){
scanf("%s", str[i]+);
len[i] = ;
for(int j=; str[i][j]!='\0'; j++){
len[i]++;//统计串长度
}
} memset(vis, , sizeof(vis));
memset(has_cal, , sizeof(has_cal));
int flag = ;
for(int i=; i<n; i++){
for(int j=; j<i; j++){
if(vis[j]) continue; //存在秩比它更大的母串,跳过此次比对
if(!has_cal[j]) {
get_next(j, next[j]);
has_cal[j] = ;
}
//printf("%s %s\n", str[i]+1, str[j]+1);
if(Index_KMP(i, j, , next[j]) == ){
flag = i+;
break; //i是当前最优解
}else vis[j] = ;
}
}
printf("Case #%d: %d\n", ca, flag ? flag : -);
}
return ;
}
【HDU 5510 Bazinga】字符串的更多相关文章
- hdu 5510 Bazinga(字符串kmp)
Bazinga Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- TTTTTTTTTTTTTTTT hdu 5510 Bazinga 字符串+哈希
Bazinga Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- Bazinga HDU 5510 Bazinga(双指针)
Bazinga HDU 5510 Bazinga(双指针) 题链 解法:对于串i来说,如果串i是不符合的,那么代表串i之前的字符串都是i的子串,那么我们求一个新的i(定义为ti),如果i是ti 的子串 ...
- HDU 5510 Bazinga 暴力匹配加剪枝
Bazinga Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5510 ...
- hdu 5510 Bazinga KMP+尺取法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 题意:至多50组数据,每组数据至多500个字符串,每个字符串的长度最长为2000.问最大的下标( ...
- hdu 5510 Bazinga (KMP+暴力标记)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 思路: 一开始直接用KMP莽了发,超时了,后面发现如果前面的字符串被后面的字符串包含,那么我们就 ...
- hdu 5510 Bazinga
http://acm.hdu.edu.cn/showproblem.php?pid=5510 Problem Description: Ladies and gentlemen, please sit ...
- HDU 5510 Bazinga (2015沈阳现场赛,子串判断)
Bazinga Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 5510 Bazinga (kmp+dfs剪枝) 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
废话: 这道题很是花了我一番功夫.首先,我不会kmp算法,还专门学了一下这个算法.其次,即使会用kmp,但是如果暴力枚举的话,还是毫无疑问会爆掉.因此在dfs的基础上加上两次剪枝解决了这道题. 题意: ...
随机推荐
- Javascript构造函数学习
我们经常会用JS的构造函数实现Java语言中的继承,今天整理一下构造函数的相关属性及说明. 下面定义一个构造函数: function Person(name, sex, age) { this.nam ...
- Python 协程(gevent)
协程,又叫微线程,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈.因此: 协程能保留上 ...
- iOS开发-Runtime详解(简书)
简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的.比如: [receiver message]; // ...
- 动态规划之最长公共子序列LCS(Longest Common Subsequence)
一.问题描述 由于最长公共子序列LCS是一个比较经典的问题,主要是采用动态规划(DP)算法去实现,理论方面的讲述也非常详尽,本文重点是程序的实现部分,所以理论方面的解释主要看这篇博客:http://b ...
- handsontable插件HOOK事件
Hook插件 afterChange (changes: Array, source: String):1个或多个单元格的值被改变后调用 changes:是一个2维数组包含row,prop,o ...
- C#实现下载功能,可用于软件自动更新
以前在百度写的文档,转移到此处 软件截图: 代码下载: http://twzy.ys168.com/ 在代码下载文件夹中 //代码: using System; using System.Comp ...
- 介绍一款Android小游戏--交互式人机对战五子棋
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6589025 学习Android系统开发之余,编 ...
- 5. openCV中常用函数学习
一.前言 经过两个星期的努力,一边学习,一边写代码,初步完成了毕业论文系统的界面和一些基本功能,主要包括:1 数据的读写和显示,及相关的基本操作(放大.缩小和移动):2 样本数据的选择:3 数据归一化 ...
- 面试前的准备---C#知识点回顾----05
技术博客还得继续写,工作还在筛选,学习还得继续 1.Session和Cookie的使用区别 很容易回答的就是Session在服务器端,存储的数据可以较大容量,比如我们存一个Table,上千条数据. C ...
- jQuery对象和dom对象之间的相互转化
var domObj = document.getElementById("demo"); var $Obj = $("#demo"); DOM转jQuery: ...