hdu 5510 strstr/find/KMP
来源:互联网 发布:必胜客千层面知乎 编辑:程序博客网 时间:2024/06/04 01:06
HDU-5510-Bazinga
Problem Description
For n given strings S1,S2,⋯,Sn, labelled from 1 to n, you should find the largest i (1≤i≤n) such that there exists an integer j (1 ≤ j < i)and Sj is not a substring of Si.
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
题意:给N个串,求最大的i,使得存在j(<=0j<i),串j不是i的字串,有则输出i,否则暑促-1.
思路:先跑一遍循环,前后两个串进行比较,如果钱一个串是后一个串的字串,那钱一个串就没有用了。
eg:如果第i个串是第i+1个串的字串,如果第i+1个串是i+1后变的串的字串,那么第i个串久没有用了,如果第i+1个串不是后边串的字串,那么就找到了结果。
即定义指针i,j,如果s[i]是s[j]的字串,==>i++
else ans = j;
(因为如果s[i]是s[j]的字串,那么i++,==> 1~i-1全部的串一定是i~j中某些串的字串,所以i~l-1就没有必要和后边的串进行比较了)//剪枝
如何判断s[j]是否是s[i]的字串?
1.KMP
2.s[i].find(s[j])!=string::npos
3.strstr(s[i],s[j])!=-1
其他解法:KMP+二分
//// main.cpp// 160929//// Created by 刘哲 on 17/5/30.// Copyright © 2016年 my_code. All rights reserved.//#include <bits/stdc++.h>#include <iostream>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <string.h>#include <map>#include <set>#include <queue>#include <deque>#include <list>#include <bitset>#include <stack>#include <stdlib.h>#define lowbit(x) (x&-x)typedef long long ll;typedef long long LL;using namespace std;int n;char s[505][2010];int flag[505];int main(){ int T; cin>>T; int n; int cas = 1; while(T--) { cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; memset(flag,1,sizeof(flag)); int ans=-1; for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) if(flag[j]) { if(strstr(s[j],s[i]))break; else { flag[j]=0; ans=max(ans,j); } } } cout<<"Case #"<<cas++<<": "<<ans<<endl; } return 0;}
或者:
//// main.cpp// 160929//// Created by 刘哲 on 17/5/30.// Copyright © 2016年 my_code. All rights reserved.//#include <bits/stdc++.h>#include <iostream>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <string.h>#include <map>#include <set>#include <queue>#include <deque>#include <list>#include <bitset>#include <stack>#include <stdlib.h>#define lowbit(x) (x&-x)typedef long long ll;typedef long long LL;using namespace std;int n;//char s[505][2010];string s[501];int flag[505];int main(){ int T; cin>>T; int n; int cas = 1; while(T--) { cin>>n; for(int i=1;i<=n;i++) cin>>s[i]; memset(flag,1,sizeof(flag)); int ans=-1; for(int i=1;i<n;i++) { for(int j=i+1;j<=n;j++) if(flag[j]) { //if(strstr(s[j],s[i])) if(s[j].find(s[i])!=string::npos) break; else { flag[j]=0; ans=max(ans,j); } } } cout<<"Case #"<<cas++<<": "<<ans<<endl; } return 0;}
- hdu 5510 strstr/find/KMP
- hdu 5510 Bazinga 剪枝+find()/strstr()/KMP
- HDU 5510 Bazinga(KMP||strstr神器+些许优化)
- hdu 2203 亲和串(KMP|strstr())
- HDU 2203 亲和串 (KMP或者strstr)
- HDU 2203:亲和串【KMP & strstr函数】
- KMP算法与string::find以及strstr的比较
- HDU 5510 Bazinga 【strstr】
- hdu 5510 Bazinga (字符串匹配 kmp/strstr加个剪枝←据说这些都不是正解)
- HDU-#2087 剪花布条(KMP & strstr)
- hdu 2087 剪花布条 strstr使用 或者 KMP
- hdu 2203 kmp+strstr两种方法代码
- 【HDU 2087】剪花布条 【KMP or strstr函数】
- strstr函数(KMP算法)
- KMP实现的strstr
- LeetCode Implement strStr() --- KMP
- Implement strStr() [LeetCode] + KMP
- KMP 算法 && Implement strStr()
- 剑指offer-07-从上往下打印出二叉树的每个节点,同层节点从左至右打印。
- MapReduce原理与设计思想
- VR 、SR 轴矢冠三个切面的显示
- java 学习笔记--利用反射实现自定义toString()的工具类
- Python中os与sys两模块的区别
- hdu 5510 strstr/find/KMP
- 简单的MVP+Retrofit+RxJava请求网络数据(一)
- 百度NLP | 神经网络语义匹配技术
- 主流浏览器对 clientHeight 和 scrollHeight 的解释
- SVN服务的搭建(一)
- SQL大全(一)
- 第7次数据结构上机--树和二叉树的基本运算实现
- [leetcode]: 204. Count Primes
- C语言中数据类型的自动类型转换