终曲
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1002 Accepted Submission(s): 280
Problem Description
最后的挑战终于到了!
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
站在yifenfei和MM面前的只剩下邪恶的大魔王lemon一人了!战胜他,yifenfei就能顺利救出MM。
Yifenfei和魔王lemon的挑战很简单:由lemon给出三个字符串,然后要yifenfei说出第一串的某个子串,要求该子串长度最小,并且同时包含第2个串和第3个串。
特别地,如果有多个这样的子串,则请输出字母序最小的一个。
Input
输入数据首先是一个整数C,表示测试数据有C组;
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10
接着是C组数据,每组包含三行字符串,第一个字符串长度大于1小于100
后面两个串的长度大于1且小于10
Output
请对应每组输入数据输出满足条件的最短子串;
如果没有,请输出 No
如果没有,请输出 No
Sample Input
2 abcd ab bc abc ab bd
Sample Output
abc No
Author
yifenfei
Source
Recommend
yifenfei
注意 : 要求最短的中的 字典序最小的
#include<stdio.h>
#include<string.h>
#include<string>
#include<map>
using namespace std;
int main()
{
char str[111],a[11],b[11];
int cas,i,j,minlen;
scanf("%d",&cas);
while(cas--)
{
minlen=999999999;
scanf("%s %s %s",str,a,b);
map<string,int>mp;
int len=strlen(str);
for(i=1;i<=len;i++)//表示长度 长度是可以为len的
{
for(j=0;j+i<=len;j++)//起始位置 注意 j+i可以等于len
{
char ans[111];
int cnt=0;
for(int k=j;k<i+j&&k<len;k++)
ans[cnt++]=str[k];
ans[cnt]='\0';
mp[ans]=1;
// if(i<minlen) minlen=i;
}
}
map<string,int>::iterator it;
int flag=0;
string ans="";
for(it=mp.begin();it!=mp.end();it++)
{
if(it->first.length()<minlen)
{
if(strstr(it->first.c_str(),a)&&strstr(it->first.c_str(),b))
{
minlen=it->first.length();
ans=it->first;flag=1;
//printf("%s\n",it->first.c_str());flag=1;break;
}
}
}//printf("what?");
if(flag==0) printf("No\n");
else printf("%s\n",ans.c_str());
}
return 0;
}