比较简单的搜索,主要是决定任意两个字符串之间是否有题目所要求的关系 #include <iostream> #include <vector> #include <string.h> using namespace std; vector<int> adj[1000]; char str[1000][84]; int len[1000]; int first, D; char fstr[84]; int ans; #define max(a,b) ((a)>(b)?(a):(b)) bool strtest(int s1, int s2) { int i, j; if (strcmp(str[s1], str[s2]+1) == 0) return true; if (strncmp(str[s1], str[s2], len[s1]) == 0) return true; for (i=1; i<len[s1]; i++) { if (strncmp(str[s1], str[s2], i)==0 && strncmp(str[s1]+i, str[s2]+i+1, len[s1]-i)==0) return true; } return false; } void search(int s) { int i; if (adj[s].empty()) { if (len[s]>len[ans]) ans = s; return; } for (i=0; i<adj[s].size(); i++) { search(adj[s].at(i)); } } int main() { int i, j; while (cin>>D) { cin >> fstr; first = -1; for (i=0; i<D; i++) { cin >> str[i]; len[i] = strlen(str[i]); if (first==-1 && strcmp(str[i], fstr)==0) first = i; } for (i=0; i<D; i++) for (j=i+1; j<D; j++) { if (len[i]==len[j]-1 && strtest(i, j)) adj[i].push_back(j); if (len[i]==len[j]+1 && strtest(j, i)) adj[j].push_back(i); } ans = first; search(first); cout << str[ans] << endl; } return 0; }