UVA 123

来源:互联网 发布:mysql union all 编辑:程序博客网 时间:2024/06/03 17:59

题目大意:输入一些单词,这些是不重要的单词。由“::”分界,输入一些句子,句子去除所有不重要的单词以外的其他单词,每个都是关键词,重复单词,也是都关键的。每个句子的可根据关键词的个数n,分为n个句子只有一个关键词大写的句子。按照字典次序,排序这些关键词,输出,如果一个句子中有同样的关键词,按大写的先后顺序。不同句子有同样的关键词,则按句子顺序。

解题思路:用set存所有不重要的单词,每个句子根据关键词变化出的n个句子,将关键词,句子,同时对应输入到两个不同的数组里。最后冒泡排序关键词,同时句子也变换顺序就ok了。稳定排序重要的。注:它跳出输入句子是流结束(ctrl+Z),如果以为的双回车就gg超时了。

ps:一早上想着用map,存关键词和句子。结果各种wa,不过也打了map,set,vector。迭代器,map按value排序,sort排序巴拉巴拉,挺好的,还是有所收获。

ac代码:

#include <iostream>#include <set>#include <cstring>using namespace std;set<string> s;int temp2 = 0; string ll[1005], kk[1005], temp;void exchange(char a[]){char word[1005], sen[1005];int len=strlen(a);for (int i=0; i<len; i++)if (a[i] >= 'A' && a[i] <= 'Z')a[i] += 32; for (int i=0; i<len; i++){if ( isalpha(a[i]) )for (int j=0; isalpha(a[i]); j++,i++){word[j] = a[i];word[j+1] = '\0';}if (!s.count(word)){for (int j=0; j<len; j++){if ( j<i-strlen(word) || j>=i)sen[j] = a[j];else sen[j] = a[j]-32;sen[j+1] = '\0';}ll[temp2] = sen;kk[temp2++] = word;}}}int main(){char a[5005];int i, j;for (i=0;  ; i++){scanf("%s", a);if (!strcmp(a, "::"))break;s.insert(a);} while (gets(a)) exchange(a);for (i=0; i<temp2; i++)for (j=0; j<temp2-i-1; j++){if ( kk[j]>kk[j+1] ){temp = ll[j];ll[j] = ll[j+1];ll[j+1] = temp;temp = kk[j];kk[j] = kk[j+1];kk[j+1] = temp;}}for (i=0; i<temp2; i++)cout << ll[i] << endl;return 0;}

后来发现竟然有个multimap容器,可以有相同的键。美滋滋

ac代码去掉了冒泡:

#include <iostream>#include <set>#include <map>#include <cstring>using namespace std;set<string> s;int temp2 = 0multimap <string, string> m;multimap <string, string>::iterator it;void exchange(char a[]){char word[1005], sen[1005];int len=strlen(a);for (int i=0; i<len; i++)if (a[i] >= 'A' && a[i] <= 'Z')a[i] += 32for (int i=0; i<len; i++){if ( isalpha(a[i]) )for (int j=0; isalpha(a[i]); j++,i++){word[j] = a[i];word[j+1] = '\0';}if (!s.count(word)){for (int j=0; j<len; j++){if ( j<i-strlen(word) || j>=i)sen[j] = a[j];else sen[j] = a[j]-32;sen[j+1] = '\0';}m.insert(make_pair(word, sen));}}}int main(){char a[5005];int i, j;for (i=0;  ; i++){scanf("%s", a);if (!strcmp(a, "::"))break;s.insert(a);} while (gets(a)) exchange(a);for (it=m.begin(); it!=m.end(); it++)cout << it->second << endl;return 0;}
原创粉丝点击