Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

求助:Trie树WA了

Posted by ravenclaw at 2019-08-14 18:56:45 on Problem 2138
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <stack>
#include <deque>
#include <list>
#include <cassert>
#if __cplusplus >= 201103L
#include <unordered_map>
#include <unordered_set>
#endif
using namespace std;
#define pb push_back
#define mp make_pair
#ifdef GRAPH
typedef pair <int, int> Edge;
#define v first
#define w second
#endif
#define lsh(i) (1 << (i))
#define lshll(i) (1LL << (i))
#define rep(i, n) for (int (i) = 0; (i) < n; (i)++)
#define until(x) while (!x)
#define fail(s) assert(!s)
const int INF = 0x3f3f3f3f;
const long double EPS = 1e-6;
const int N = 1010, C = 27;
struct TrieNode {
	int dest[C];
	int terminate;
	TrieNode() {
		memset(dest, 0, sizeof(dest));
		terminate = 0;
	}
};
TrieNode Trie[90 * N];
int root = 0, tot = 1;
void TrieInsert(string s, int xx) {
	int x = root;
	for (int i = 0; i < (int)s.length(); i++) {
		int p = s[i] - 'a';
		if (!Trie[x].dest[p])Trie[x].dest[p] = ++tot;
		x = Trie[x].dest[p];
	}
	Trie[x].terminate = xx;
}
int TrieFind(string s) {
	int x = root;
	for (int i = 0; i < (int)s.length(); i++) {
		int p = s[i] - 'a';
		if (!Trie[x].dest[p])return -1;
		x = Trie[x].dest[p];
	}
	return Trie[x].terminate;
}
int n;
string start;
string s[N];
int vis[N]; 
vector <int> G[N];
void BFS() {
	queue <int> q;
	q.push(0);
	vis[0] = true;
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		for (vector <int> :: iterator it = G[u].begin(); it != G[u].end(); it++) {
			int v = *it;
			if (vis[v]) continue;
			vis[v] = true;
			q.push(v);
		} 
	}
}
int main() {
	ios::sync_with_stdio(false);
	cin >> n >> start;
	TrieInsert(start, 0);
	for (int i = 1; i <= n; i++) {
		cin >> s[i];
		if (s[i].length() > 3)
			TrieInsert(s[i], i);
	}
	for (int i = 1; i <= n; i++) {
		string now = s[i];
		for (int j = 0; j < (int)now.length(); j++) {
			now.erase(now.begin() + j);
			cerr << now << endl;
			int x = TrieFind(now);
			if (x != -1) {
				G[x].pb(i);
				cerr << x << ' ' << i << endl; 
			} 
			now = s[i];
		}
	}
	BFS();
	int besti = 0, bestv = -1;
	for (int i = 0; i <= n; i++) {
		if (vis[i] == 1 && ((int)s[i].length() > bestv)) {
			bestv = s[i].length();
			besti = i;
		}
	} 
	cout << s[besti] << endl;
	return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator