Shortest Prefixes POJ - 2001(统计次数)
题意:
输出每个单词的缩写 使得每个单词 互不相同。。
解析:
统计每个前出现的次数。。。然后在查询的时候 遇到次数为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; }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。