電話代の請求書のPOJ3630
思考
この中にカジュアルワーキング:POJ3630
辞書ツリーに電話番号を回します。それ以外の場合はイエスであり、数は、挿入プロセスは、エンド・ノード、または完全なプラグである場合、この数は決してないことを示す、新しいノードを作成しません。
ACコード
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<queue>
#include<cstring>
#include<vector>
#define ll long long
#define N 200010
using namespace std;
int tot = 1;
int trie[N][10];
int endi[N];
vector<int> resort;
int main() {
int t;
cin >> t;
for (int i = 0; i < t; i++) {
int sign = 0;
tot = 1;
memset(trie, 0, sizeof(trie));
memset(endi, 0, sizeof(endi));
int n;
cin >> n;
for (int j = 0; j < n; j++) {
char s[20] = { 0 };
scanf_s("%s", s, 20);
if (sign)
continue;
int sq = 0;
int mark = 0;
for (int k = 0; k < strlen(s); k++) {
if (trie[sq][s[k] - '0'] == 0) {
tot++;
trie[sq][s[k] - '0'] = tot;
sq = tot;
mark = 1;
}
else {
sq = trie[sq][s[k] - '0'];
}
if (endi[sq] == 1) {
resort.push_back(0);
sign = 1;
break;
}
if (k == strlen(s) - 1) {
if (mark == 0) {
resort.push_back(0);
sign = 1;
break;
}
else
endi[sq] = 1;
}
}
}
if (sign)
continue;
resort.push_back(1);
}
for (int i = 0; i < t; i++) {
if (resort[i])
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}