题目1149:子串计算:字符串处理

来源:互联网 发布:android实时更新数据 编辑:程序博客网 时间:2024/05/17 23:15
题目1149:子串计算

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:752

解决:404

题目描述:

给出一个01字符串(长度不超过100),求其每一个子串出现的次数。

输入:

输入包含多行,每行一个字符串。

输出:

对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。

样例输入:
10101
样例输出:
0 201 21 310 2101 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****************************************************************/




0 0
原创粉丝点击