标签:
题解:
去掉输入过程中重复的单词,需要对统一小写后的单词排序,例如 aab cdf frf aab AaB,小写排序后是aab aab aab cad frf,那么很容易遍历一遍进行标记,将输入重复的单词只保留一个。
? 寻找回文,例如adc cda utg 三个单词,对每一个单词进行字母排序后再整体排序,排序结果是:acd acd gtu ,出现次数大于一次的很显然是回文, 那么和上面一样,很容易遍历2遍后将出现次数大于一次的单词去掉。最后剩下的就是非回文。然后对非回文进行排序输出即可。
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <algorithm>#include <cctype>using namespace std;string ss[10000];char s[100];int k,k2,tag[10000];struct Node{ string ori,low,sor;//ori原始输入,low小写处理,sor字母排序}str[10000];bool cmp1(Node a,Node b){//按照小写后单词进行排序处理 return a.low < b.low;}bool cmp2(Node a,Node b){//按照字母排序后的单词排序处理 return a.sor < b.sor;}void set(Node&b,Node&a){//赋值操作 b.ori = a.ori;b.low = a.low;b.sor=a.sor;}int main(){ //freopen("1.in","r",stdin); while(scanf("%s",s)!=EOF && s[0]!=‘#‘){ str[k].ori = s; for(int i=0;s[i];i++)s[i]=tolower(s[i]); str[k].low = s ;//小写 sort(s,s+strlen(s)); str[k++].sor = s;//排序 } //对小写后的单词进行排序,目的是去除输入过程中重复的单词 sort(str,str+k,cmp1); string pre = ""; for(int i=0;i<k;i++){ if(str[i].low == pre)tag[i]=1; pre = str[i].low; } for(int i=0;i<k;i++){ if(!tag[i])set(str[k2++],str[i]); else tag[i]=0; } //对字母排序后的单词排序,目的是寻找回文单词 k = k2; sort(str,str+k,cmp2); pre = ""; for(int i=0;i<k;i++){ if(str[i].sor == pre)tag[i]=1; pre = str[i].sor; } for(int i=0;i<k;i++) if(tag[i])tag[i-1]=1; k2=0; for(int i=0;i<k;i++) if(!tag[i])ss[k2++]=str[i].ori; //最后对原始输入排序输出。 sort(ss,ss+k2); for(int i=0;i<k2;i++) cout << ss[i]<<endl;} |
Winter-2-STL-F Ananagrams 解题报告及测试数据
标签:
原文地址:http://www.cnblogs.com/gzdaijie/p/4298829.html