zoukankan      html  css  js  c++  java
  • 统计相似字符串

    http://acm.xidian.edu.cn/problem.php?cid=1028&pid=5

    题目描述

    给N个字符串,请将他们以相同的组成元素(即组成的元素种类相同,每种元素的个数也一样)来分类,分类后按照原本出现的顺序输出!

    输入

    多组数据,最多100组数据,每组最多N<5000个字符串,每个字符串长度最多|s|<=8,保证都是小写字母

    输出

    输出多行,每行为同一类别的字符串组

    样例输入

    6
    eat tea tan ate nat bat
    

    样例输出

    eat tea ate
    tan nat
    bat

    1、排序+离散化处理

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cstdlib>
     5 using namespace std;
     6 struct node{
     7     char arr[9],brr[9];
     8     int num;
     9 }st[10000];
    10 struct nod{
    11     char aa[9];
    12     int s,t,num;
    13 }st2[10000];
    14 bool cmp(node a,node b){
    15     if(strcmp(a.brr,b.brr)==0) return a.num<b.num;
    16     else return strcmp(a.brr,b.brr)<0;
    17 }
    18 
    19 bool cmp2(nod a,nod b){
    20     return a.num<b.num;
    21 }
    22 
    23 int main(){
    24     int n;
    25     while(scanf("%d",&n)!=EOF){
    26         memset(st,0,sizeof(st));
    27         memset(st2,0,sizeof(st2));
    28         for(int i=0;i<n;i++){
    29             scanf("%s",st[i].arr);
    30             st[i].num=i;
    31             strcpy(st[i].brr,st[i].arr);
    32             sort(st[i].brr,st[i].brr+strlen(st[i].brr));
    33         }
    34         
    35         sort(st,st+n,cmp);
    36         
    37         
    38         int i,j;
    39         strcpy(st2[0].aa,st[0].brr);
    40         st2[0].num=st[0].num;
    41         st2[0].s=0;
    42         st2[0].t=0;
    43         
    44         for(i=1,j=0;i<n;i++){
    45             if(strcmp(st[i].brr,st2[j].aa)!=0){
    46                 j++;
    47                 st2[j].num=st[i].num;
    48                 st2[j].s=i;
    49                 st2[j].t=i;
    50                 strcpy(st2[j].aa,st[i].brr);
    51             }
    52             else{
    53                 st2[j].t++;
    54             }
    55         }
    56         
    57         sort(st2,st2+j+1,cmp2);
    58         for(int k=0;k<=j;k++){
    59             printf("%s",st[st2[k].s].arr);
    60             for(int t1=st2[k].s+1;t1<=st2[k].t;t1++){
    61                 printf(" %s",st[t1].arr);
    62             }
    63             printf("
    ");
    64         }
    65     }
    66     return 0;
    67 } 

    2、排序+二分

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cstdlib>
     5 #include<string>
     6 using namespace std;
     7 struct node{
     8     char arr[9],brr[9];
     9     int num;
    10 }st[10000];
    11 struct nod{
    12     char aa[9];
    13     int num;
    14 }st2[10000];
    15 bool used[10000];
    16 int n;
    17 /*快排必须要有二级排序*/
    18 bool cmp(node a,node b){
    19     if(strcmp(a.brr,b.brr)<0) return a.num<b.num;
    20     else return strcmp(a.brr,b.brr)<0;
    21 }
    22 
    23 
    24 int search(int x){
    25     int l=0,r=n;
    26     while(l<r){
    27         int mid=(l+r)/2;
    28         if(strcmp(st[mid].brr,st2[x].aa)>=0) r=mid;
    29         else l=mid+1;
    30     }
    31     return r;
    32 }
    33 int main(){
    34     while(scanf("%d",&n)!=EOF){
    35         memset(st,0,sizeof(st));
    36         memset(st2,0,sizeof(st2));
    37         memset(used,0,sizeof(used));
    38         for(int i=0;i<n;i++){
    39             scanf("%s",st[i].arr);
    40             st2[i].num=st[i].num=i;
    41             strcpy(st[i].brr,st[i].arr);
    42             strcpy(st2[i].aa,st[i].arr);
    43             sort(st[i].brr,st[i].brr+strlen(st[i].brr));
    44             sort(st2[i].aa,st2[i].aa+strlen(st2[i].aa));
    45         }
    46         
    47         sort(st,st+n,cmp);
    48         
    49         
    50         for(int i=0;i<n;i++){
    51             int temp=search(i);
    52             if(used[temp]) continue;
    53             bool flag=false;
    54             while(true){
    55                 if(flag==false){ printf("%s",st[temp].arr);flag=true;}
    56                 else printf(" %s",st[temp].arr);
    57                 used[temp]=true;
    58                 if(strcmp(st[temp+1].brr,st[temp].brr)!=0){
    59                     printf("
    ");
    60                     break;
    61                 }
    62                 temp++;
    63             }
    64             
    65         }
    66     }
    67     return 0;
    68 } 
  • 相关阅读:
    mac下完全卸载程序的方法
    Mac下检测NSTableView的滑动事件的方法
    一行代码起动全屏
    Unsupported compiler '4.0' selected for architecture 'i386'类错误解决办法
    编译错误“The run destination My Mac 64bit is not valid for Running the scheme '***',解决办法
    ios项目中导入百度地图SDK出错的问题
    Unable to resolve target 'android9'解决办法
    ios保存录制好的视频到相簿的方法
    NSTableView系列之代码创建(不用nib)
    谈内链优化不是每个站点都能做的
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6720124.html
Copyright © 2011-2022 走看看