终曲
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 971 Accepted Submission(s): 273
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/*
转载:
/*未ac代码,没找到原因,~~~~(>_<)~~~~ */一组坑爹的数据:(蛋疼不理解) zzzz zz zzz zz */ #include <string> #include <iostream> #include <string.h> #include <set> using namespace std; struct comp { bool operator()(const string &a ,const string & b) { if(a.length()==b.length()) return a.compare(b); return a.length()<b.length(); } }; int main() { int n,l1,l2,l3; char s1[101],s2[11],s3[11],st[101],*p,*q; set <string,comp>an; string ss; cin>> n; while (n--) { cin >> s1>>s2>>s3; l1=strlen(s1); l2=strlen(s2); l3=strlen(s3); p=q=s1; p=strstr(p,s2); q=strstr(q,s3); if(p && q) { while(p && q) { if(p<q) { strncpy(st,p,q-p+l3); st[q-p+l3]='\0'; p=strstr(p+1,s2); } else { strncpy(st,q,p-q+l2); st[p-q+l2]='\0'; q=strstr(q+1,s3); } ss=st; an.insert(ss); } cout << *an.begin() << endl; } else cout << "No" << endl; an.clear(); } return 0; }
#include<iostream> using namespace std; char *judge(char a[],char b[]){ //比较字符串的大小 for(int i=0;i<strlen(b);i++){ if(a[i]<b[i]) return a; else if(a[i]>b[i]) return b; } return b; } int main() { int t; cin>>t; getchar(); while(t--){ char a[1020],b[120],c[120],d[1020],m[1020]; memset(m,255,sizeof(m)); cin>>a>>b>>c; int lena=strlen(a),i,j,min=100000; for(i=0;i<lena;i++) //枚举a[]的每个字串 for(j=0;j<lena;j++) { for(int k=i;k<=j;k++) d[k-i]=a[k]; d[k-i]='\0'; if((strstr(d,b)!=NULL&&strstr(d,c)!=NULL)&&min>=strlen(d)){ //判断b,c,是否是d[]的字串,去最小长度字串 min=strlen(d); memcpy(m,judge(m,d),strlen(d)+1); //去最小字符串 } } if(min==100000) cout<<"No"<<endl; else cout<<m<<endl; } return 0; }