HDU 5510 Bazinga 【strstr】

Bazinga

Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d &%I64u

Submit Status

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

For given strings , labelled from to , you should find the
largest such that there exists an integer and is not a
substring of .

A substring of a string is another string that occurs in . For
example, ruiz" is a substring ofruizhang”, and rzhang" is not a
substring of
ruizhang”.

Input The first line contains an integer which is the number of test
cases. For each test case, the first line is the positive integer
and in the following lines list are the strings . All strings
are given in lower-case letters and strings are no longer than
letters.

Output For each test case, output the largest label you get. If it
does not exist, output .

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亚洲区沈阳站-重现赛(感谢东北大学)

题意:就是给定一串字符串,要找到下标最大的i使得存在一个j<’i且s[j]不是s[i]的子串。

我也是看到别人写的博客学到了strstr(母串,待判定是否为子串的串)函数
if(!strstr(s[i],s[j]))就可以判断s[j]不是s[i]的子串
听说不必kmp慢 strstr与kmp对比
首先暴力写了一个果然超时,然后想想加点技巧
idea:先预处理每个相邻的串,如果s[j]是s[j+1]的子串,那么判断s[j]不为s[i]子串时直接跳过去判断s[j+1]即可!


#include<stdio.h>
#include<string.h>

char s[505][2005],v[505];

int main()
{
    int t,T,n,i,j,flag;
    scanf("%d",&T);
    for(t=1;t<=T;t++)
    {
        memset(v,0,sizeof(v));
        scanf("%d",&n);
        for(i=0;i<n;i++)
        scanf("%s",s[i]);
        for(i=0;i<n-1;i++)
        if(strstr(s[i+1],s[i])!=NULL)
        v[i]=1;

        for(i=n-1;i>=0;i--)
        {
            flag=1;
            for(j=0;j<i;j++)
            if(v[j]) continue;
            else
            if(strstr(s[i],s[j])==NULL)
            {
                flag=0;
                break;
            }
            if(flag==0)
                break;
        }
        printf("Case #%d: ",t);
        printf((flag==1)?"-1\n":"%d\n",i+1);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值