题目1149:子串计算
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:752
解决:404
-
题目描述:
-
给出一个01字符串(长度不超过100),求其每一个子串出现的次数。
-
输入:
-
输入包含多行,每行一个字符串。
-
输出:
-
对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。
-
样例输入:
-
10101
-
样例输出:
-
0 2 01 2 1 3 10 2 101 2
-
来源:
- 2010年北京大学计算机研究生机试真题
- 一开始看,觉得好难处理,没有头绪,甚至想到KMP匹配算法(还不理解)。后来想到字符串的函数strcmp()作比较,暴力搜索。过程中,先求出所有子串的出现数量,涉及qsort()函数的使用和strcmp()函数实现字符串的字典序。其实在遍历所有子串的写法十分烂,使用strncpy()还可以更简单。还好,AC。
-
#include<stdio.h> #include<stdlib.h> #include<math.h> #include<string.h> typedef struct node { char z[100]; int len,num; }zichuan; zichuan b[10000]; char a[105]; int length,k; void fen() { int i,j; int p,q; char tem[105]; for(i=1;i<length;i++) { for(j=0;j<length&&i+j-1<length;j++) { q=0; for(p=j;p<j+i;p++) tem[q++]=a[p]; tem[q]='\0'; for(p=0;p<k;p++) if(b[p].len==i&&strcmp(tem,b[p].z)==0) { b[p].num++; break; } if(p==k) { b[k].len=i; b[k].num=1; strcpy(b[k].z,tem); k++; } } } } int cmp(const void *a,const void *b) { struct node *aa=(node *)a; struct node *bb=(node *)b; return strcmp((*aa).z,(*bb).z); } void print() { int i,j; for(i=0;i<k;i++) { if(b[i].num>1) printf("%s %d\n",b[i].z,b[i].num); } } int main() { int i,j; while(scanf("%s",a)!=EOF) { length=strlen(a); k=0; fen(); qsort(b,k,sizeof(b[0]),cmp); print(); } return 0; } /************************************************************** Problem: 1149 User: smileyk Language: C++ Result: Accepted Time:30 ms Memory:2076 kb ****************************************************************/
-
-