时间限制: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 Gym100735 G.LCS Revised (KTU Programming Camp (Day 1) Lithuania, Birˇstonas, August 19, 2015)

    G.LCS Revised   The longest common subsequence is a well known DP problem: given two strings A and B ...

  2. 某考试 T1 fair (18.5.1版)

    转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n. 然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2 ...

  3. WPF 自动验证

    WPF中TextBox的自动验证: 演示 : 用以下两个TextBox分别显示验证IP和非空值验证,先看效果: IP自动验证效果: 非空值自动验证效果: 第一步:定义TextBox验证的样式: < ...

  4. 接口测试 rest-assured 使用指南

    转自:https://testerhome.com/topics/7060 原文:https://github.com/rest-assured/rest-assured/wiki/Usage本文gi ...

  5. vue.js+koa2项目实战(三)登录注册模态框

    登录注册模态框 注: [Vue warn]: Do not use built-in or reserved HTML elements as component id: diaLog 原因:diaL ...

  6. scramble-string——两个字符串经过树化并旋转后是否一致、递归、动态规划

    Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...

  7. tomcat启动出现异常 Error filterStart

    tomcat启动中出现 Error filterStart异常, 没有任何堆栈信息,如下: SEVERE: Error filterStart Jul 6, 2012 3:39:05 PM org.a ...

  8. 阿里云 RDS实例间的数据迁移

    使用数据传输DTS可以实现两个RDS实例间的数据迁移.对于支持增量迁移的存储引擎,还可以使用DTS在源RDS实例不停服的情况下,将数据迁移到目标RDS实例.目前对于RDS不同存储引擎,只支持同构迁移( ...

  9. GitFlow工作流常用操作流程

    1. 主要分支介绍 1.1 master分支 主分支,产品的功能全部实现后,最终在master分支对外发布. 1.2 develop分支 开发分支,基于master分支克隆,产品的编码工作在此分支进行 ...

  10. Spring 小记

    本作品由Man_华创作,采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.基于http://www.cnblogs.com/manhua/上的作品创作. 使用STS新建spr ...