时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1026

解决:571

题目描述:

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

输入:

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

输出:

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

样例输入:
10101
样例输出:
0 2
01 2
1 3
10 2
101 2
来源:
2010年北京大学计算机研究生机试真题

思路:

计数然后排序。呃,我怎么会写了这么长的代码。。。

代码:

#include <stdio.h>
#include <string.h> #define M 100 int main(void)
{
int n, i, j, k, m;
char s[M+1], son[M][M][M+1];
char *pson[M][M], *ptmp;
int c[M][M], count[M];; while (scanf("%s", s) != EOF)
{
//printf("s=%s\n", s);
for (i=0; i<M; i++)
{
for (j=0; j<M; j++)
c[i][j] = 0;
} n = strlen(s);
for (i=1; i<=n; i++)
{
for (j=0; j<=n-i; j++)
{
strncpy(son[i-1][j], s+j, i);
son[i-1][j][i] = '\0';
}
//for (j=0; j<=n-i; j++)
//{
// printf("i=%d, j=%d, s=%s\n", i, j, son[i-1][j]);
//}
count[i-1] = 0;
for (j=0; j<=n-i; j++)
{
ptmp = son[i-1][j];
if (j==0)
{
//printf("i=%d, j=%d, count[i-1]=%d, ptmp=%s\n", i, j, count[i-1], ptmp);
pson[i-1][j] = ptmp;
count[i-1] ++;
c[i-1][j] ++;
}
else
{
//printf("i=%d, j=%d, count[i-1]=%d, ptmp=%s\n", i, j, count[i-1], ptmp);
for (k=0; k<count[i-1]; k++)
{
/*
if (i==2 && k<2 )
{
printf("===\n");
for (int jj=0; jj<count[i-1]; jj++)
{
printf("i=%d, jj=%d, s=%s, c=%d\n", i, jj, pson[i-1][jj], c[i-1][jj]);
}
printf("===\n");
}
*/
if (strcmp(ptmp, pson[i-1][k]) == 0)
{
//printf("strcmp==0, i=%d, j=%d, k=%d, ptmp=%s, pson[i-1][k]=%s\n", i, j, k,
//ptmp, pson[i-1][k]);
c[i-1][k] ++;
break;
}
else if (strcmp(ptmp, pson[i-1][k]) < 0)
{
//printf("strcmp<0, i=%d, j=%d, k=%d, ptmp=%s, pson[i-1][k]=%s\n", i, j, k,
//ptmp, pson[i-1][k]);
for (m=count[i-1]-1; m>=k; m--)
{
pson[i-1][m+1] = pson[i-1][m];
c[i-1][m+1] = c[i-1][m];
}
pson[i-1][k] = ptmp;
c[i-1][k] = 1;
count[i-1] ++;
break;
}
//printf("strcmp>0, i=%d, j=%d, k=%d, ptmp=%s, pson[i-1][k]=%s\n", i, j, k,
//ptmp, pson[i-1][k]);
if (k == count[i-1]-1)
{
k ++;
pson[i-1][k] = ptmp;
c[i-1][k] = 1;
count[i-1] ++;
break;
}
}
}
//printf("-----i=%d, j=%d, pson[i-1][count[i-1]-1]=%s\n", i, j, pson[i-1][count[i-1]-1]);
}
/*
printf("===\n");
for (j=0; j<count[i-1]; j++)
{
printf("i=%d, j=%d, s=%s, c=%d\n", i, j, pson[i-1][j], c[i-1][j]);
}
printf("===\n");
*/
} int nk, nm;
int ctmp;
for (i=1; i<=n; i++)
{
for (j=0; j<count[i-1]; j++)
{
//printf("i=%d, j=%d\n", i, j);
if (i==n && j==count[i-1]-1)
break;
for (k=1; k<=n-i+1; k++)
{
for (m=0; m<count[k-1]; m++)
{
//printf("i=%d, j=%d, k=%d, m=%d\n", i, j, k, m);
if (k==n-i+1 && m>=count[k-1]-1-j)
break;
if (m==count[k-1]-1)
{
nk = k+1;
nm = 0;
}
else
{
nk = k;
nm = m+1;
}
if (strcmp(pson[k-1][m], pson[nk-1][nm]) > 0)
{
ptmp = pson[k-1][m];
pson[k-1][m] = pson[nk-1][nm];
pson[nk-1][nm] = ptmp;
ctmp = c[k-1][m];
c[k-1][m] = c[nk-1][nm];
c[nk-1][nm] = ctmp;
}
}
if (k==n-i+1 && m==count[k-1]-1-j)
break;
}
}
if (i==n && j==count[i-1]-1)
break;
} for (i=1; i<=n; i++)
{
//printf("\n");
for (j=0; j<count[i-1]; j++)
{
if (c[i-1][j] >= 2)
printf("%s %d\n", pson[i-1][j], c[i-1][j]);
}
//printf("\n");
}
} return 0;
}
/**************************************************************
Problem: 1149
User: liangrx06
Language: C
Result: Accepted
Time:400 ms
Memory:1952 kb
****************************************************************/

九度OJ 1149:子串计算 (计数、排序)的更多相关文章

  1. 【九度OJ】题目1202:排序 解题报告

    [九度OJ]题目1202:排序 解题报告 标签(空格分隔): 九度OJ [LeetCode] http://ac.jobdu.com/problem.php?pid=1202 题目描述: 对输入的n个 ...

  2. 九度OJ 1349:数字在排序数组中出现的次数 (排序、查找)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2489 解决:742 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小. ...

  3. 九度oj 题目1130:日志排序

    题目描述: 有一个网络日志,记录了网络中计算任务的执行情况,每个计算任务对应一条如下形式的日志记录:“hs_10000_p”是计算任务的名称,“2007-01-17 19:22:53,315”是计算任 ...

  4. 【九度OJ】题目1202:排序

    题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=100).    接下来的一行包括n个整数. 输出: 可能有多组测试数据,对于每组数据,将排序后 ...

  5. 九度OJ 1010:计算A+B【字符串和数组】

    /*======================================================================== 题目1010:A + B 时间限制:1 秒内存限制 ...

  6. 【九度OJ】题目1201-二叉排序树

    题目 建树过程是递归,"递归的思路不是很复杂",经过题目1078的训练,直接开始编码.提交及修改的过程告诉自己,这是一个错觉,对递归的理解还应该再进一步. 自己的实现 #inclu ...

  7. 九度OJ 1525 子串逆序打印 -- 2012年Google校园招聘笔试题目

    题目地址:http://ac.jobdu.com/problem.php?pid=1525 题目描述: 小明手中有很多字符串卡片,每个字符串中都包含有多个连续的空格,而且这些卡片在印刷的过程中将字符串 ...

  8. 九度OJ 1346:会员积分排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:967 解决:413 题目描述: 元旦佳节快到了,超市A想要给会员一些奖品.但是奖品有限,所以它需要给这些会员做一个排序,然后将名单输出来.排 ...

  9. 九度OJ 1339:ACM (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:712 解决:379 题目描述: 今年的ACM世界总决赛快要开始了,需要有一个排名算法来对每支队伍进行现场排名.ACM组委会把这个任务交给了你 ...

随机推荐

  1. Codeforces Round #455 (Div. 2) A. Generate Login【贪心】

    A. Generate Login time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  2. 修改Tomcat服务中的端口配置

    1.修改Tomcat服务中的端口配置: 分别修改安装目录下的conf子目录中的server.xml文件(注意:两个文件中对应的端口号要不一样),修改如下 : a. 修改Shutdown端口(默认为80 ...

  3. 在网页里插入flash的代码

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...

  4. ylb:SQL 索引(Index)

    ylbtech-SQL Server: SQL Server-SQL 索引(Index) SQL 索引(Index). ylb:索引(Index) 返回顶部 --=================== ...

  5. Android跨进程訪问(AIDL服务)

    我将AndroidAIDL的学习知识总结一下和大家共享 在Android开发中,AIDL主要是用来跨进程訪问. Android系统中的进程之间不能共享内存,因此,须要提供一些机制在不同进程之间进行数据 ...

  6. 软件业的发展方向:云、Web以及App

    随着行业互联网的发展,未来的软件发展方向是云技术.Web软件以及基于移动设备的Apps. 桌面软件主要负责大型的计算.渲染和消耗非常大CPU和内存的图形软件,以及基于这些软件的二次开发软件如Revit ...

  7. C/C++内存管理详解(转)

    内存分配方式 简介 在C++中,内存分成5个区,他们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动 ...

  8. csdn开源夏令营-ospaf中期报告

    1.背景         随着将中期的代码托管到CSDN的平台上,ospaf(开源项目成熟度分析工具)已经有了小小的雏形.当然还远远不够.       首先还是要感谢这次活动组织方CSDN,感觉挺有G ...

  9. Node.js学习笔记(4)——除了HTTP(服务器和客户端)部分

    很多node入门的书里面都会在介绍node特性的时候说:单线程,异步式I/O,事件驱动. Node不是一门语言,它是运行在服务器端的开发平台,官方指定语言为javascript. 阻塞和线程: 线程在 ...

  10. Oracle 使用TRUNCATE TABLE删除所有行

    若要删除表中的所有行,则 TRUNCATE TABLE 语句是一种快速.有效的方法.TRUNCATE TABLE 与不含 WHERE 子句的 DELETE 语句类似.但是,TRUNCATE TABLE ...