hdu 1247 Hat’s Words

来源:互联网 发布:农村淘宝代收点 编辑:程序博客网 时间:2024/06/07 05:44

题意:给你一些字符串,找出哪些字符串是由给的字符串中某两个字符串组成。

解法:字典树,把给的字符串放进字典树,然后枚举每一个字符串,拆分当前字符串,然后到字典树中去找。

#include<bits/stdc++.h>using namespace std;char str[50005][100];struct node{    int cnt;    node *next[26];    node()    {        cnt=0;        for(int i=0;i<26;i++)            next[i]=NULL;    }}*root;void mt(char *s){    node *p=root;    int len=strlen(s);    for(int i=0;i<len;i++)    {        int j=s[i]-'a';        if(p->next[j]==NULL)        {            p->next[j]=new node;            p=p->next[j];        }        else            p=p->next[j];    }    p->cnt++;}bool sm(char *ss){    node *p=root;    int len=strlen(ss);    for(int i=0;i<len;i++)    {        int j=ss[i]-'a';        if(p->next[j]==NULL)            return false;        p=p->next[j];    }    if(p->cnt)        return true;}void dt(node *T){    if(T==NULL)        return;    for(int i=0;i<26;i++)        if(T->next[i]!=NULL)            dt(T->next[i]);    free(T);    return;}int main(){    root=new node;    int k=0;    while(scanf("%s",str[k])!=EOF)    {        mt(str[k]);        k++;    }    for(int i=0;i<k;i++)    {        int len=strlen(str[i]),j;        char st[100],sst[100];        for(j=1;j<len;j++)        {            int v;            for(v=0;v<j;v++)                sst[v]=str[i][v];            sst[v]='\0';            strncpy(st,str[i]+j,len-j);            st[len-j]='\0';            if(sm(sst)&&sm(st))            {                printf("%s\n",str[i]);                break;            }        }    }    dt(root);    return 0;}


 

0 0
原创粉丝点击