做的第一个Trie。
#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
const int maxnode = 50000 * 10 + 10;
const int sigma_size = 26;
struct Trie {
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void clear() { sz = 1; memset ( ch[0], 0, sizeof ( ch[0] ) ); }
int idx ( char c ) { return c - 'a'; }
void insert ( string s, int v ) {
int u = 0, n = s.length ( );
for ( int i = 0; i < n; ++i ) {
int c = idx ( s[i] );
if ( !ch[u][c] ) {
memset ( ch[sz], 0, sizeof ( ch[sz] ) );
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] = v;
}
bool find ( string s ) {
int u = 0, n = s.length ();
for ( int i = 0; i < n; ++i ) {
int c = idx ( s[i] );
if ( !ch[u][c] ) return false;
u = ch[u][c];
}
if ( val[u] != 0 ) return true;
else return false;
}
}trie;
int main ( ) {
//freopen ( "input.txt", "r", stdin );
string s[50005];
int cnt = 1;
trie.clear();
while ( cin >> s[cnt] ) {
trie.insert ( s[cnt], cnt );
cnt++;
}
for ( int i = 1; i <= cnt; ++i )
for ( int j = 1; j < s[i].size (); ++j ) {
string s1 ( s[i], 0, j );
string s2 ( s[i], j, s[i].size() - 1 );
//cout << s1 << " " << s2 << endl;
if ( trie.find ( s1 ) && trie.find( s2 ) ) {
cout << s[i] << endl;
break;
}
}
}