hdu1247

链接:点击打开链接

题意:给出一些单词,以EOF结束,看其中哪一个单词可以由其他两个单词组成,将其输出

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
int str1[50005][30],dis[50005];
int root;
void in(char *s){
    int u=0;
    for(;*s;s++){
        if(!str1[u][*s-'a'])
        str1[u][*s-'a']=root++;
        u=str1[u][*s-'a'];
    }
    dis[u]++;
}
int fi(char *s){
    int u=0;
    for(;*s;s++){
        if(!str1[u][*s-'a'])
        return 0;
        u=str1[u][*s-'a'];
    }
    return dis[u];
}                                   //单纯的字典树单词查找模板
int main()
{
    int i,j;
    char str[50005][20];
    char a[20],b[20];
    int n=1,len;
    root=1;
    memset(str1,0,sizeof(str1));
    memset(dis,0,sizeof(dis));
    while(scanf("%s",str[n])!=EOF){ //后面借鉴了其它人的代码,主要就是将单词拆开遍历
        in(str[n]);                 //主要是运用了strncpy,这个函数用的很巧妙
        n++;
    }
    for(i=0;i<n;i++){
        len=strlen(str[i]);
        for(j=0;j<len;j++)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            strncpy(a,str[i],j);
            strncpy(b,str[i]+j,len-j);
            if(fi(a)&&fi(b)){
                printf("%s\n",str[i]);
                break;
            }
        }
    }
    return 0;
}

你可能感兴趣的:(hdu1247)