Compound Words

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=91209#problem/C

题意:   有一堆按照字典序排好的字符串,问你有多少字符串是由其它两个字符串组成。

法一:STL  set

#include <iostream>
#include <set>
#include <cstdio>
#include <string>
using namespace std;

set <string> mys;

int main(){
  string st;
  set <string>::iterator it;
  while(cin>>st) mys.insert(st);   //插入mys
  for(it=mys.begin();it!=mys.end();it++){
    st=*it;
    for(int i=0;i<st.length()-1;i++){
      string sub1=st.substr(0,i+1);
      string sub2=st.substr(i+1,st.length()-(i+1));  //http://www.w3school.com.cn/php/func_string_substr.asp
      if( mys.find(sub1)!=mys.end() && mys.find(sub2 )!=mys.end() ){
        printf("%s
",st.c_str());
        break;
      }
    }
  }
  return 0;
}

法二:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char ss[120010][50];
int bj(char *s,int n)
{
    int l=0,r=n-1,mid,x;
    while (l<=r)
    {
        mid=(l+r)/2;
        x=strcmp(s,ss[mid]);
        if(x==0)
            return 1;
        if(x<0)
            r=mid-1;
        else  l=mid+1;
    }
    return 0;
}
int main()
{
    char s1[100],*s2;
    int n,j,i,len,k;
   i=0;
    while(~scanf("%s", ss[i]))  i++;
      n=i;
    for(i=0;i<n;i++)
    {
         len=strlen(ss[i]);
        for( j=0,k=0;j<len-1;j++)
        {
            s1[k++]=ss[i][j];
            s1[k]='';
            s2=ss[i]+j+1;
            if(bj(s1,n)&&bj(s2,n))
            {
                printf("%s
",ss[i]);
                break;
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/fenhong/p/4931236.html