| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2866 人关注过本帖
标题:为什么我的老是时间超限,内存却用的很少
只看楼主 加入收藏
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:8 
为什么我的老是时间超限,内存却用的很少
http://www.
这个题目做下来用时1002ms,内存20多k,看别人的居然是时间20多ms,内存1600多k,谁能帮忙看看是什么地方出问题了。
#include<stdio.h>
#include<string.h>
int main()
{
    char da[1000000],xiao[10000];
    int i,j,k,ci,xiaode,dade,ge;
    scanf("%d",&ge);
    while(ge--)
    {
        scanf("%s%s",xiao,da);
        k=0;ci=0;
        xiaode=strlen(xiao);
        dade=strlen(da);
        for(i=0;i<xiaode/2;)
        {
            if(xiao[i]==xiao[xiaode-1])
            {
                if(xiao[i+1]==xiao[i])
                {i++;xiaode--;}
                else i++;
            }
            else break;
        }
        xiaode=strlen(xiao);
        for(j=0;j<dade;)
        {
            if(da[j]==xiao[k])
            {j++;k++;}
            else if(k>=xiaode)
            {j=j-i;k=0;ci++;}
            else if(j+xiaode>dade) break;
            else k=0;
        }
        if(j>=dade&&k>=xiaode)
            ci=ci+1;
        printf("%d\n",ci);
    }
    return 0;
}
搜索更多相关主题的帖子: 内存 include xiao 
2012-03-23 05:40
nicum
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:180
专家分:712
注 册:2011-2-1
收藏
得分:8 
什么题目呀,这样看很费劲
2012-03-23 11:25
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:8 
kmp

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2012-03-23 11:29
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 2楼 nicum
这个题目是计算小串在大串中被包含的次数,并输出。
2012-03-23 21:05
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 3楼 卧龙孔明
你的意思是我应该用KMP算法,还是?
2012-03-23 21:08
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:13 
唉,这种题最让我郁闷。
用不着KMP,题面的条件是错误的。
我按原题条件开的数组结果运行错误,但将数组扩大到两倍就AC了。

程序代码:
#include<stdio.h>
#include<string.h>
char dna[2000000], virus[20000];
int cal(char *d, char *v)
{
    int i, j, c, ld, lv;
    lv = strlen(v);
    ld = strlen(d) - lv;
    for(c = i = 0; i <= ld; i++)
    {
        for(j = 0; j < lv && d[i + j] == v[j]; j++);
        if(j == lv) c++;
    }
    return c;
}
int main()
{
    int n;
    for(scanf("%d", &n); n--; printf("%d\n", cal(dna, virus)))
        scanf("%s %s", virus, dna);
    return 0;
}


重剑无锋,大巧不工
2012-03-24 19:35
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 6楼 beyondyf
我找到了一个看起来更简单的方法,先判断小串里面那个字符出现的次数最少,在小串中出现的位置,比如为a[i]然后在大串中找这个字符,找到后,向后退i个元素这个元素跟小串的第一个字符比较,如果相同,那么比较第二个出现次数最少的字符。看位置跟小串中的位置是不是对应,不是就说明他们不匹配。
个人愚见,我感觉kmp太复杂了,把我给绕进去了,特别是next[i]的那些东西
2012-03-25 22:46
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:11 
回复 7楼 小赵q1
一个合理的算法就应该适应于所有的情况或者说不适合的情况是可以处理的

你的这个算法如果碰到比如小串是aaaaaaaaaaa,大串是aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa,这种类型的数据,时间复杂度就完全倒退到枚举比较了
2012-03-25 22:58
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 8楼 czz5242199
感觉要判断的条件多了,里面的if于语句真多呀,大眼一瞄感觉好复杂一样
2012-03-25 23:24
快速回复:为什么我的老是时间超限,内存却用的很少
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.027231 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved