HDU 5510(找子串,char + strstr)

Ladies and gentlemen, please sit up straight. 
Don't tilt your head. I'm serious. 


For n given strings S1,S2,⋯,Sn, labelled from 1 to n, you should find the largesti (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 nn 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

题意:

让你从一堆有编号的串中找出最后面的一个i,使得在[1,i-1]中可以找到一个串s[j]不是s[i]的子串

思路: 很明显,如果 S 是 T 的子串,T 是 F 的子串,那么S 肯定是 T 的子串,所以我们只需要 倒着来,然后判断是不是子串就行了。      在下蒟蒻, string + kmp 就TLE。 叹气.jpg

AC代码:

#include<bits/stdc++.h>
using namespace std;

char s[505][2200];

int main()
{
    int t; scanf("%d",&t);
    int Case = 1;
    while(t --){
        int n; scanf("%d",&n);
        for(int i = 1;i <= n;i ++)
            scanf("%s",s[i]);
        int flag = -1;
        for(int i = n;i > 1;i --){
            if(!strstr(s[i],s[i-1])){
                flag = max(flag,i);
                for(int j = n;j >= i;j --){
                    if(!strstr(s[j],s[i-1])){
                        flag = max(flag,j);
                        break;
                    }
                }
            }
        }
        printf("Case #%d: %d\n",Case++,flag);
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值