找核心子字符串问题(暴力 枚举)

1.
问题 H: 崩溃的oj
时间限制: 1 Sec  内存限制: 128 MB
提交: 211  解决: 96
[提交][状态][讨论版]
题目描述

你们总说

oj崩了

oj又打不开了

但是你们有考虑过

oj也很辛苦了吗

oj也很累啊

你们没有

你们只想着你们自己

你们只想着交作业

//貌似没毛病,剧情反转

言归正传,不讲段子了,oj最近经常崩溃,他能怎么办,他也很无奈啊,他试图向外界发送着一条包含
了错误信息由大小写英文字母组成的代码,凑巧的是plyjdz学长收到了这一条消息,他试图破解这条信
息,然而他发现由于网络原因,其中核心部分出现次数最多,但是比较懒的皮卡丘表示并不想筛选出核
心代码,于是他决定把这个任务交给学弟学妹们。

输入
    一个字符串由且仅由大小写英文字母组成,长度不超过360。

输出
 
    输出分为两行

第一行输出核心字段即出现次数最多的字符子串(子串长度大于等于2)

第二行输出该字段出现的次数

样例输入

emmmmmemmm

样例输出

mm
6

分析题意:
找字符串中出现次数最多的子字符串,
如果有多个出现次数最多的字符子串,输出最长的一个,如果最长的有多个,输出最先出现的。

暴力破解
:二重循环,由首和尾字符确定一个字符串(尾字符下标一定大于首字符的)
三重循环移动查找,四重循环确定查找的字符串相同。

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char a[361],b[361];
    cin>>a;
    int len=strlen(a);
    int maxnum=0,num;
    int maxlen=0;
    for(int i=0;i<=len-2;i++)             //i指向字符串头部
        {
            for(int j=i+1;j<=len-1;j++)   //j指向字符串尾部
               {
                       num=1;                // i,j确定一个字符串
                       for(int l=1;l+j<=len-1;l++)
                           { //向右遍历同长度的字符串:l表示移动的位数,k表示字符串的每一位
                               int k;
                            for(k=i;k<=j;k++)
                               {    //!!!!!技巧在于每一位的下标表示及循环的指针表示上!!!!
                                    if(a[i+k-i]!=a[i+l+k-i])
                                       break;
                               }
                            if(k==j+1)    //for循环到末尾 ,会加一。
                                num++;
                        }
                    if(num>maxnum)
                       {
                               maxnum=num;
                            maxlen=j-i;
                            for(int p=i;p<=j;p++)
                                b[p-i]=a[p];     //不应刻意去计算头和尾
                       }
                    if(num==maxnum)
                        {
                             if(j-i>maxlen)
                                {
                                    maxlen=j-i;
                                    for(int k=i;k<=j;k++)
                                        b[k-i]=a[k];
                                }
                        }    

               }
        }
    for(int i=0;i<=maxlen;i++)
        cout<<b[i];
    cout<<endl;
    cout<<maxnum<<endl;
    return 0;
}
时间: 2024-08-01 10:45:38

找核心子字符串问题(暴力 枚举)的相关文章

UVA 725 Division ( 找出 abcde / fghij = N的形式—— 暴力枚举 )

Division Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Write a program that finds and displays all pairs of 5-digit numbers that between them use the digits 0 through 9 once each, such that the first number divide

hdu 5247 找连续数【暴力枚举】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5247 分析:这道题是2015百度之星初赛1的2题,当时没看这道题 是队友看的,比完以后也做了一下,思路大体都是一样的,就是 暴力枚举,因为k<=1000,那么我们可以每一点x为起点跑[x,x+999] 这段区间,把每得到一段连续的子区间[x,?],则num[len]++(len=size([x,?])); 这样就可以了,最后num数组里就是对应的答案 献上代码: #include<stdio.h&

uva 565 - Pizza Anyone?(暴力枚举 + 二进制)

题目:uva 565 - Pizza Anyone?(暴力枚举 + 二进制) 题目大意:题目是说有一个人要帮他的朋友们定批萨,然后每个朋友都有自己的口味要求,问能不能定一个批萨然后满足每个朋友的至少一个要求. 能就输出所定批萨里面加的东西,,输出要求按字典序: 不能就输出:No pizza can satisfy these requests. 解题思路:这题里面有16种材料,每种材料只有取与不取的可能,这样就有 2^16 种( 0 - 2^16 - 1),枚举出每种情况然后在分别看是否能满足每

2018ACM校赛 D 白狼(暴力枚举)

问题 D: 白狼 时间限制: 1 Sec  内存限制: 128 MB 题目描述 三原发现了一个古老的咒语S,咒语只有两个字母o和k组成.三原深知咒语的强大威力,无奈自己只知道破解咒语的法印具有什么特性,而不知道具体的法印应该是什么.具三原手中的古卷描述,法印同咒语,也是只有o和k两个字母组成的,但是法印不应该是咒语中出现的任何一段连续的字母,而且在所有能够满足上述条件的法印中,越短的法印力量越强大,若两个法印长度相同,字典序更小的法印力量更强大,求能够破解咒语的力量最强大的法印. 输入 一行咒语

HDU-1015 Safecracker(暴力枚举)

题目回顾(HDU-1015) Safecracker Problem Description "The item is locked in a Klein safe behind a painting in the second-floor library. Klein safes are extremely rare; most of them, along with Klein and his factory, were destroyed in World War II. Fortunat

hdu4282A very hard mathematic problem 暴力枚举

//给出k //找x,y,z使得x^z+y^z+x*y*z = k //x,y,z都为正整数x<y,z>1问有多少种方法 //当z = 2时,可以看到左边是一个完全平方 //而当z>=3时,可以暴力枚举x,y //由于k<2^31所以x<2^(31/3)枚举复杂度可以过 #include<cstdio> #include<cstring> #include<iostream> #include<cmath> using name

ZOJ3818-Pretty Poem(暴力枚举)

题目链接 题意:求所给字符串是否符合ABABA或者ABABCAB的形式,如果可以的话输出Yes,不可以的话为No. 思路:暴力枚举A和B的长度,再用从长度减去3倍的AB长度,即为C的长度,看组合而成的字符串是否与给定的相等.在这里string中的substr函数是个好东西. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <string> #include <a

暴力枚举总述

暴力枚举总述 暴力枚举就是就是把所有可能的答案一一列举出来再加以判断.虽然方法有些笨,但问题规模不大或者没有好的解法时,这也是一个能用的方法. 问题一:输入1~9范围内的整数n,字典序输出1~n这n个数的全排列. 分析:每个数字都是n位数,可看做由前缀A和后缀B组成.初始时前缀A为空.函数伪代码见下: void f(A,B){ //要求的全排列为:已确定的字符串A加上B集合中数字的全排列 if(B为空)  {输出全排列,return;} for(i=1;i<=n;i++){ 若数字i在B中,f(

hdu_2328_Corporate Identity(暴力枚举子串+KMP)

题目链接:hdu_2328_Corporate Identity 题意: 给你n个串,让你找这n个串的最大公共子串 题解: 串比较小,暴力枚举第一个的子串,然后KMP判断是否可行 1 #include<cstdio> 2 #include<cstring> 3 #define F(i,a,b) for(int i=a;i<=b;i++) 4 5 const int N=210; 6 int nxt[N],n,lens[4001],ans,l,r,cnt; 7 char dt[