统计相似字符串

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("\n");
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("\n");
60                     break;
61                 }
62                 temp++;
63             }
64
65         }
66     }
67     return 0;
68 } 
时间: 2024-08-07 00:04:54

统计相似字符串的相关文章

Java实现统计某字符串在另一个字符串中出现的次数

面试时会经常考这样的题目,估计也不让使用正则表达式.还好这个算法还算简单,不过在草稿纸上写难免会出现运行异常,好吧,面试官赢了,乃们屌丝就实实在在的把代码码出来吧. 下面是实现代码: /** * 统计某字符串在另一个字符串中出现的次数 * * */ public class CountHit { public static void main(String[] args) { String a = "123456abcde6ab"; String b = "6abc"

统计重复字符串 如 eeefffkkkhjk 得到如下结果 3e3f3khjk;

//统计重复字符串 如 eeefffkkkhjk 得到如下结果 3e3f3khjk; string zipStr = Console.ReadLine(); var charList = zipStr.ToCharArray(); var listArray = new List<char>(); foreach (var item in charList) { if (!listArray.Contains(item)) { listArray.Add(item); } } var dic

统计一个字符串中的单词的个数,并打印各个单词

/*测试数据:Shen zhen is a beautiful city!*/ /*运行结果:Word:6 Shen zhen is a beautiful city!*/ #include<stdio.h> #define SIZE 1000 void wordCount(char *str) { int count = 0, flag = 0; char *p = str; while (*p != '\0'){ while (*p == 32){ if (*(p + 1) == 0){/

java循环练习:输入一个字符串,统计该字符串中分别包含多少个数字,多少个字母,多少个其他字符

package practiceGO; import java.util.Scanner; /*  * 3.输入一个字符串,统计该字符串中分别包含多少个数字,多少个字母,多少个其他字符  */ public class Cto { public static void main(String[] args) {         int englishCount = 0;// 英文字母个数         int spaceCount = 0;// 空格个数         int numCoun

用c语言统计一个字符串中有多少个数字字符

用c语言统计一个字符串中有多少个数字字符. #include<stdio.h>int main(){    char ch;     int count=0;    while((ch=getchar())!='\n')     {        if(ch>'0'&&ch<'9')              count++;     }     printf("%d\n",count);     return 0; }

字符串之“统计一个字符串中单词的个数”

题目:统计一个字符串中单词的个数 输入一行字符,统计其中有多少个单词,单词之间用空格分隔开 输入:my name is jacky 输出:the number of word is 4 代码如下: #include <stdio.h> int main(int argc, char *argv[]) { char str[80]; int i=0,num=0,flag=0; char c; gets(str); while((c=str[i])!='\0') { if(c==' ') flag

黑马程序员——统计一个字符串中各个字符出现的次数

统计一个字符串中各个字符出现的次数 import java.util.Iterator; import java.util.Set; import java.util.TreeMap; public class TreeMapDemo { //统计一个字符串中相应字符出现的次数 public static void main(String[] args) { // String s = "aagfagdlkerjgavpofjmvglk我是你的"; //调用自定义方法来 统计相应字符出

Java编程练习之判断Java文件名是否正确,判断邮箱格式是否正确和统计指定字符串中某字符现的次数

一判断Java文件名是否正确,判断邮箱格式是否正确 功能:判断Java文件名是否正确,判断邮箱格式是否正确.其中:合法的文件名应该以.java结尾:合法的邮箱名 中至少要包含 "@" , 并要求 "@" 在 "." 之前. 练习代码: public class Test { public static void main(String[] args) { //Java文件名 String fileName = "HelloWorld.j

Linux 统计某个字符串出现的次数

要统计一个字符串出现的次数,这里现提供自己常用两种方法: 1. 使用vim统计 用vim打开目标文件,在命令模式下,输入 :%s/objStr//gn 即可 2. 使用grep: grep -o objStr filename|wc -l 如果是多个字符串出现次数,可使用: grep -o ‘objStr1\|objStr2' filename|wc -l #直接用\| 链接起来即可

统计一个字符串中英文字母、空格、数字和其它字符的个数

1 package demo; 2 import java.util.Scanner; 3 /** 4 * 统计一个字符串中英文字母.空格.数字和其它字符的个数 5 */ 6 public class Statistics1 { 7 public static void main(String[]args){ 8 int i; 9 int LetterCount = 0; 10 int SpaceCount = 0; 11 int NumberCount = 0; 12 int OtherCou