题意:
输出每个单词的缩写 使得每个单词 互不相同。。
解析:
统计每个前出现的次数。。。然后在查询的时候 遇到次数为1的返回即可。。
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #define rap(i, a, n) for(int i=a; i<=n; i++) #define rep(i, a, n) for(int i=a; i<n; i++) #define lap(i, a, n) for(int i=n; i>=a; i--) #define lep(i, a, n) for(int i=n; i>a; i--) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 10100, INF = 0x7fffffff; int trie[maxn][26], sum[maxn]; int rt, tot; char str[maxn][22]; vector<char> v; void build(char *s) { int len = strlen(s); rt = 0; for(int i=0; i<len; i++) { int x = s[i] - 'a'; if(trie[rt][x] == 0) trie[rt][x] = ++tot; rt = trie[rt][x]; sum[rt]++; } } void qp(char *s) { int len = strlen(s); rt = 0; for(int i=0; i<len; i++) { v.push_back(s[i]); int x = s[i] - 'a'; if(trie[rt][x] == 0) return; rt = trie[rt][x]; if(sum[rt] == 1) return; } } int main() { int cnt = 0; while(cin>> str[++cnt]) { build(str[cnt]); } rap(i, 1, cnt) { v.clear(); qp(str[i]); cout<< str[i] << " "; for(int i=0; i<v.size(); i++) cout<<v[i]; cout<<endl; } return 0; }