现在的位置: 首页 > 综合 > 正文

hdu 2572 终曲

2018年05月02日 ⁄ 综合 ⁄ 共 2213字 ⁄ 字号 评论关闭

终曲

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1289    Accepted Submission(s): 370

Problem Description
最后的挑战终于到了!
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
 

Input
输入数据首先是一个整数C,表示测试数据有C组;
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10
 

Output
请对应每组输入数据输出满足条件的最短子串;
如果没有,请输出 No
 

Sample Input
2 abcd ab bc abc ab bd
 

Sample Output
abc No
/*题解: 先求出下面两个字符串在第一个字符串中的下标位置,如果字符串没有包含下面的字符串(即未记录下标位置)则输出No, 根据开始下标和结束下标求出包含两个字符串的子串。  然后排序,求出最短子串。若长度相同则排字母序。  */
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s1[1010],s2[1010],s3[1010];
struct ST
{
    int st;
    int end;
}e1[1010],e2[1010];
struct MS
{
char s[110]; 
}e[1010];
int cmp(MS a,MS b)
{
	int x=strlen(a.s),y=strlen(b.s);
	if(x==y)
       return strcmp(a.s,b.s)<0;
       else return x<y; 
} 
int main()
{
    int i,j,k,k1,k2,T,t,a,b,l;
    int str[100];
    scanf("%d",&T);
    while(T--)
	{
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        memset(s3,0,sizeof(s3));
        scanf("%s %s %s",s1,s2,s3);
        int len1=strlen(s1),len2=strlen(s2),len3=strlen(s3);
        i=j=k1=0;
        while(i<len1)
		{          //将模式串在目标串中的位置统计出来 
            j=0;
            t=i;
            while(s2[j]==s1[t]&&j<len2)
			{
                j++;
                t++;
            }
          // printf("%d--\n",j);
            if(j==len2)
			{
                e1[k1].end=t-1;
                e1[k1].st=e1[k1].end-len2+1;
                k1++;
            }
            i++;
        }          
        i=j=k2=0;
        while(i<len1)
		{       //将模式串在目标串中的位置统计出来 
            j=0;
            t=i;
            while(s3[j]==s1[t]&&j<len3)
			{
                j++;
                t++;
            }
          //  printf("%d--\n",j);
            if(j==len3)
			{
                e2[k2].end=t-1;
                e2[k2].st=e2[k2].end-len3+1;
                k2++;
            }
            i++;
        }
       for(i=0,k=0; i<k1; i++)
	   {
            for(j=0; j<k2; j++)
			{
                a=min(e1[i].st,e2[j].st);
                b=max(e1[i].end,e2[j].end);
                for(l=0;a<=b;a++) e[k].s[l++]=s1[a];
                e[k++].s[l]='\0';              //求出包含两个字符串的子串 
            }
        }
        sort(e,e+k,cmp);               //排序,先排长度,再排字典序 
        if(k==0) printf("No\n"); 
        else
		{
            printf("%s",e[0].s);
            printf("\n");
        }
        
    }
    return 0;
}
 
/*题解:
    见识到C++函数的强大功能,不愧是在C的改进上的一门语言
    */
#include<cstring>
#include<iostream>
using namespace std;
int main()
{
    int T,i,j,n;
    cin>>T;
    while(T--)
    {
        string s,s1,s2,s3,str;    //str起临时存储的作用 
        cin>>s1>>s2>>s3;
        n=s1.length();
        str=s1+"#";            
        for(i=0; i<n; i++)
        {
            for(j=i+1; j<=n; j++)
            {
                s=s1.substr(i,j-i);   //substr是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。
                if(s.find(s2)!=-1&&s.find(s3)!=-1)  //未找到s2、s3则返回-1 
                {          
                    if(s.length()<str.length())
                    {
                        str=s;
                    }
                    else if(s.length()==str.length())
                    {
                        if(s<str)
                        str=s;
                    }
                }
            }
        }
        if(str.length()==n+1) cout<<"No"<<endl;
        else 
        cout<<str<<endl;
    }
    return 0;
}

 

抱歉!评论已关闭.