时间限制: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. NanoPC-T3 64位裸机编程 —— 启动和运行状态切换

    参考: https://github.com/metro94/s5p6818_spl https://github.com/trebisky/Fire3/tree/master/Boot_NSIH h ...

  2. oracle中的替换函数replace和translate函数

    .translate 语法:TRANSLATE(char, from, to) 用法:返回将出现在from中的每个字符替换为to中的相应字符以后的字符串. 若from比to字符串长,那么在from中比 ...

  3. Flexible and Economical UTF-8 Decoder

    http://bjoern.hoehrmann.de/utf-8/decoder/dfa/

  4. Linux网络协议栈之数据包处理过程

    http://blog.csdn.net/cheng_fangang/article/details/8966242

  5. 关于insert|update|delete注入中的tips

    2.updatexml().extractvalue().name_const()函数的使用 3.I’ve noticed some variations in our payload. You ca ...

  6. Nginx配置文档具体解释

    Nginx的配置文档具体解释.在这儿做个总结,以便以后使用的时间查看. 下面大部分自己整理.部分来自參考 #设置用户 #user  nobody; #启动进程数(一般和server的CPU同样) #能 ...

  7. Android--数据库数据显示至屏幕

    MainActivity.java 这段代码的作用是从数据库中获取到数据并显示在界面上 import java.util.ArrayList; import java.util.List; impor ...

  8. Mysql processlist命令

    Mysql processlist命令   mysqladmin -uroot -proot processlist mysql 查看当前连接数 命令: show processlist; 如果是ro ...

  9. dedecms织梦后台password忘记了怎么办?dedecms织梦后台password忘记怎样找回password?

    方法一:自己用解密的方式 用phpmyadmin登陆后台数据库,查看 找到password:去除前三位和后一位,然后拷贝到http://www.cmd5.com/在线解密工具里面解密 watermar ...

  10. OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法

    <span style="font-size:24px;">//////第一种方法 // NSMutableArray *arr = [NSMutableArray a ...