Hat’s Words (字典树)

题意:给你一些字符串,如果有字符串是其他两个字符串的联合。输出这个字符串

思路:先把字典树造出来,然后利用substr分割成两块暴力查找即可


#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include <sstream>
#include<vector>
#include<cmath>    
#include<stack>
#include<time.h>
#include<ctime>
using namespace std;
#define LD long double
#define LL long long
#define PI acos(-1.0)
#define E 1e-9
#define eps 1e-7
#define INF 0x3f3f3f3f
#define inf 1<<30
#define maxn 100005
string a[50009] = {};
int n = 1, num = 1;
int tire[50000][30] = {};
int vis[500009] = {};
void build(string s)
{
    int len = s.length();
    int p = 0;
    for (int i = 0; i < len; i++)
    {
        int k = s[i] - 'a';
        if (!tire[p][k])
        {
            tire[p][k] = num;
            num++;
        }
        p = tire[p][k];
    }
    vis[p] = 1;
}
int search(string s)
{
    int len = s.length();
    int p = 0;
    for (int i = 0; i < len; i++)
    {
        int k = s[i] - 'a';
        if (!tire[p][k])
        {
            return 0;
        }
        p = tire[p][k];
    }
    if (vis[p] == 1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    while (cin>>a[n])
    {
        
        build(a[n]);
        n++;
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 1; j < a[i].length(); j++)
        {
            string s1, s2;
            s1 = a[i].substr(0, j);
            s2 = a[i].substr(s1.length(), a[i].length()-s1.length());
            if (search(s1) && search(s2))
            {
                cout << a[i] << endl;
                break;
            }
            else
            {
                continue;
            }
        }
    }
}

 

posted @ 2020-08-27 19:19  夜灯长明  阅读(164)  评论(0编辑  收藏  举报