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 of
ruizhang”, andrzhang" is not a
ruizhang”.
substring ofInput 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 cccSample 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;
}