2014-06-16 16:55:39
题意&思路:题意不赘述。思路:一开始的思路比较奇葩。。。后来想想并非最优。而应该从底部向上开始考虑(因为只有与第二堆底部一致的元素不用crawl),严格按照第二堆底部向上的顺序,看看第一堆中有多少个元素的顺序已经符合第二堆,剩下的元素都需要crawl,然而怎么找出这些需要crawl的元素呢。哈哈,就是第二堆中最后一个匹配元素上面的所有元素,然后按照有下到上的顺序crawl就能达到所需顺序,而且这样一定是最优的(因为只是将需要移动的序列元素各移动一次)(想一想)
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <iostream> 5 using namespace std; 6 7 struct Node{ 8 char s[105]; 9 }; 10 11 Node node1[205],node2[205]; 12 13 int main(){ 14 char t; 15 int Case,n; 16 scanf("%d",&Case); 17 while(Case--){ 18 scanf("%d",&n); 19 getchar(); 20 for(int i = 0; i < n; ++i){ 21 int cnt = 0; 22 while(t = getchar()){ 23 if(t == '\n') break; 24 node1[i].s[cnt++] = t; 25 } 26 node1[i].s[cnt] = '\0'; 27 } 28 for(int i = 0; i < n; ++i){ 29 int cnt = 0; 30 while(t = getchar()){ 31 if(t == '\n') break; 32 node2[i].s[cnt++] = t; 33 } 34 node2[i].s[cnt] = '\0'; 35 } 36 int pos = n - 1; 37 for(int i = n - 1; i >= 0; --i){ 38 if(strcmp(node1[i].s,node2[pos].s) == 0) 39 --pos; 40 } 41 for(int i = pos; i >= 0; --i) 42 printf("%s\n",node2[i].s); 43 puts(""); 44 } 45 return 0; 46 }