先对把每个单词都放到字典树中去,然后就是对每个单词进行切割,判断是否两部分都在字典树中。
/*****************************************
Author :Crazy_AC(JamesQi)
Time :2016
File Name :
*****************************************/
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <sstream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <map>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <climits>
using namespace std;
#define MEM(x,y) memset(x, y,sizeof x)
#define pk push_back
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> ii;
typedef pair<ii,int> iii;
const double eps = 1e-10;
const int inf = 1 << 30;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int maxn = 5e4 + 10;
const int maxm = 105;
char str[maxn][maxm];
char ans[maxm];
struct node {
int val;
node *nxt[26];
};
struct Tire {
node *rt;
void init() {
rt = new node();
}
void insert(char *s) {
node* p = rt;
int len = strlen(s);
for (int i = 0;i < len;++i) {
int id = s[i] - 'a';
if (p->nxt[id] == NULL) p->nxt[id] = new node();
p = p->nxt[id];
}
p->val = 1;
}
bool find(char *s) {
node *p = rt;
int len = strlen(s);
for (int i = 0;i < len;++i) {
int id = s[i] - 'a';
if (p->nxt[id] == NULL) return false;
p = p->nxt[id];
}
return p->val == 1;
}
}solve;
void del(node *t) {
for (int i = 0;i < 26;++i) {
if (t->nxt[i] != NULL) del(t->nxt[i]);
}
delete t;
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int n = 0;
solve.init();
while(scanf("%s",str[n]) != EOF) {
solve.insert(str[n]);
n++;
}
for (int i = 0;i < n;++i) {
int len = strlen(str[i]);
for (int j = 1;j < len - 1;++j) {
strncpy(ans,str[i],j);
ans[j] = '\0';
if (solve.find(ans) && solve.find(str[i] + j)) {
puts(str[i]);
break;
}
}
}
del(solve.rt);
return 0;
}