1. 程式人生 > 實用技巧 >Hat’s Words (字典樹)

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; } } } }