子串计算
- 题目链接:http://noi.openjudge.cn/ch0201/2472/
- 总时间限制: 1000ms 内存限制: 65536kB
- 描述
-
给出一个只包含0和1的字符串(长度在1到100之间),求其每一个子串出现的次数。
- 输入
- 一行,一个01字符串。
- 输出
- 对所有出现次数在1次以上的子串,输出该子串及出现次数,中间用单个空格隔开。按子串的字典序从小到大依次输出,每行一个。
- 样例输入
-
10101
- 样例输出
-
0 2 01 2 1 3 10 2 101 2
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 5 struct obj 6 { 7 char str[105]; 8 int count; 9 }; 10 11 void fun(char temp[]); 12 int cmp(const void *a,const void *b); 13 14 struct obj b[60000]; 15 int indexOfBArr=0; //b[]的下标,indexOfBArr表示b[]真正使用的行数 16 17 int main(int argc, char *argv[]) 18 { 19 char a[105],temp[105]; 20 int i,j,len,k,t; 21 22 scanf("%s",a); 23 len=strlen(a); 24 25 //枚举所有子串 26 for(i=0;i<len;i++)//枚举子串的开始点 27 { 28 k=0; 29 for(j=i;j<len;j++)//枚举子串的结束点 30 { 31 temp[k]=a[j]; 32 k++; 33 temp[k]='\0'; 34 fun(temp);//扫描b[]的每一行对应的子串,检验是否已经保存temp[]这个子串。 35 } 36 } 37 38 qsort(b,indexOfBArr,sizeof(b[0]),cmp); 39 40 for(i=0;i<indexOfBArr;i++) 41 { 42 if(b[i].count>1) 43 printf("%s %d\n",b[i].str,b[i].count); 44 }/**/ 45 46 47 return 0; 48 } 49 void fun(char temp[])//扫描b[]的每一行对应的子串,检验是否已经保存temp[]这个子串。 50 { 51 int i; 52 if(indexOfBArr==0) { strcpy(b[0].str,temp); b[0].count=1; indexOfBArr++; return;} 53 for(i=0;i<indexOfBArr;i++) 54 { 55 if(strcmp(b[i].str,temp)==0) { b[i].count++; return; } 56 } 57 58 strcpy(b[indexOfBArr].str,temp); 59 b[indexOfBArr].count=1; 60 indexOfBArr++; 61 } 62 int cmp(const void *a,const void *b) 63 { 64 struct obj x,y; 65 x=*(struct obj *)a; 66 y=*(struct obj *)b; 67 return strcmp(x.str,y.str); 68 }