HDU - 5510 Bazinga
Posted zgqblogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 5510 Bazinga相关的知识,希望对你有一定的参考价值。
Ladies and gentlemen, please sit up straight.
Don‘t tilt your head. I‘m serious.
For n given strings S, 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 S is not a substring of S.
A substring of a string S is another string that occurs
in S
. For example, ``ruiz" is a substring of ``ruizhang", and ``rzhang" is not a substring of ``ruizhang".
InputThe 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 S.
All strings are given in lower-case letters and strings are no longer than 2000 letters.OutputFor 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 cccSample Output
Case #1: 4 Case #2: -1 Case #3: 4 Case #4: 3
思路:
暑训的时候曾经写过这道题,不过我竟然忘了正解,实际上这题还是比较暴力的,由于题目要求的只是哪一个存在就行啦,所以在层层嵌套的情况下,不需要完全直接扫一编。
于是,我们首先处理出,相邻的有哪些是满足字串的关系的,然后再做处理就行啦。
代码
#include<iostream> #include<cstring> using namespace std; char a[505][2048]; int num[600]; int main() { int T; scanf("%d",&T); int Ca = 0; while(T--){ Ca++; int n; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%s",a[i]); } int ans=0; for(int i=1;i<n;i++){ num[i]=strstr(a[i+1],a[i])?1:0; } for(int i=n;i>=1;i--){ for(int j=1;j<i;j++){ if(num[j]){continue;} if(!strstr(a[i],a[j])){ ans=i; break; } } if(ans){break;} } printf("Case #%d: ",Ca); if(ans){printf("%d ",ans);} else printf("-1 "); } }
以上是关于HDU - 5510 Bazinga的主要内容,如果未能解决你的问题,请参考以下文章