http://acm.hdu.edu.cn/showproblem.php?pid=1238
2013-06-04 19:59
459 查看
其实上就是给一系列的字符串,如果一个子串或者其反串在所有字符串中出现,那问题就解决了,输出这个子串的长度就可以了。问题规模小,那就简单,主要是问题规模增大之后,系统就会time limit exceeded,所以这道题主要是考察怎么取剪枝,达到优化的目的。
1、要找的子串的最大的长度肯定不会超过字符串序列中最小的长度
2、如果当前子串与其中一个不匹配,那就不用再找了,肯定结果也是不能完全匹配的。
参考代码
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[101][101];
int main()
{
int k,t,n,a,b;
int maxn,min,len;
scanf("%d",&t);
while(t--)
{
maxn=0;
min=k=101;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%s",&str[i]);
len=strlen(str[i]);
if(len<min)
{
min=len;
k=i;
}
}
for( a=0; a<min; a++)
{
for( b=1; (b<=min-a); b++)//从第一个字符开始一次增加数量。
{
if(b<=maxn)continue;//找出子字符串。
char s1[101],s2[101];
strncpy(s1,str[k]+a,b);//拷贝给s1以便搜索。
s1[b]=s2[b]='\0';
for(int i=0; i<b; i++)
s2[i]=s1[b-i-1];//倒序与顺序均可。
bool x=true;
for(int i=0; x&&i<n; i++)
{
if(i==k)continue;
if(strstr(str[i],s1)==NULL&&strstr(str[i],s2)==NULL)//判断是否出现过(字符串)
x=false;//标记。
}
if(!x)break;//都存在就输出字符长度!为(b).
maxn=b;//表示字节长度!****(切记此处)****
}
}
printf("%d\n",maxn);
}
return 0;
}
1、要找的子串的最大的长度肯定不会超过字符串序列中最小的长度
2、如果当前子串与其中一个不匹配,那就不用再找了,肯定结果也是不能完全匹配的。
参考代码
#include<cstdlib>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char str[101][101];
int main()
{
int k,t,n,a,b;
int maxn,min,len;
scanf("%d",&t);
while(t--)
{
maxn=0;
min=k=101;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%s",&str[i]);
len=strlen(str[i]);
if(len<min)
{
min=len;
k=i;
}
}
for( a=0; a<min; a++)
{
for( b=1; (b<=min-a); b++)//从第一个字符开始一次增加数量。
{
if(b<=maxn)continue;//找出子字符串。
char s1[101],s2[101];
strncpy(s1,str[k]+a,b);//拷贝给s1以便搜索。
s1[b]=s2[b]='\0';
for(int i=0; i<b; i++)
s2[i]=s1[b-i-1];//倒序与顺序均可。
bool x=true;
for(int i=0; x&&i<n; i++)
{
if(i==k)continue;
if(strstr(str[i],s1)==NULL&&strstr(str[i],s2)==NULL)//判断是否出现过(字符串)
x=false;//标记。
}
if(!x)break;//都存在就输出字符长度!为(b).
maxn=b;//表示字节长度!****(切记此处)****
}
}
printf("%d\n",maxn);
}
return 0;
}
相关文章推荐
- Substrings &&http://acm.hdu.edu.cn/showproblem.php?pid=1238
- http://acm.hdu.edu.cn/showproblem.php?pid=1722
- http://acm.hdu.edu.cn/showproblem.php?pid=1005
- Buy the Ticket&&http://acm.hdu.edu.cn/showproblem.php?pid=1133
- http://acm.hdu.edu.cn/showproblem.php?pid=2544
- To The Max &&http://acm.hdu.edu.cn/showproblem.php?pid=1081
- http://acm.hdu.edu.cn/showproblem.php?pid=1532 EK
- HDU Today&&http://acm.hdu.edu.cn/showproblem.php?pid=2112
- 最大连续子序列http://acm.hdu.edu.cn/showproblem.php?pid=1231
- 字符输入时注意的格式(特殊情况)http://acm.hdu.edu.cn/showproblem.php?pid=1860
- http://acm.hdu.edu.cn/showproblem.php?pid=1698
- hdu1171 http://acm.hdu.edu.cn/showproblem.php?pid=1171
- FatMouse' Trade http://acm.hdu.edu.cn/showproblem.php?pid=1009
- http://acm.hdu.edu.cn/showproblem.php?pid=1568
- http://acm.hdu.edu.cn/showproblem.php?pid=3519
- HDU 1455 http://acm.hdu.edu.cn/showproblem.php?pid=1455
- Beans http://acm.hdu.edu.cn/showproblem.php?pid=2845
- http://acm.hdu.edu.cn/showproblem.php?pid=1203(背包问题)
- HDU 1702 http://acm.hdu.edu.cn/showproblem.php?pid=1702
- http://acm.hdu.edu.cn/showproblem.php?pid=1789 很好的贪心题目