题意:给出一堆单词,输出其中能切开分成两个同样出现在这些单词里的单词,按字典序输出。
题解:先读入,然后按长短排个序,然后在hash()里分出两个子串,判断是否出现过,如果是就放到另一个数组内,最后排序输出。
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int N = 120005;
string s[N], ans[N];
int n;
map<string, int> m;
int cmp (string a, string b) {
return a.size() < b.size();
}
int hash(string str) {
m[str] = 1;
int i, j, k;
for (i = 1; i < str.size(); i++) {
string temp1 = "";
for (j = 0; j < i; j++)
temp1 += str[j];
string temp2 = "";
for (k = j; k < str.size(); k++)
temp2 += str[k];
if (m[temp1] && m[temp2])
return 1;
}
return 0;
}
int main() {
while (cin >> s[n++]) {}
sort(s, s + n, cmp);
int num = 0;
for (int i = 0; i < n; i++) {
if (hash(s[i]))
ans[num++] = s[i];
}
sort(ans, ans + num);
for (int i = 0; i < num; i++)
cout << ans[i] << endl;
return 0;
}