连续子序列的模板 stl

hdu1238 暴力搜

Substrings

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9122    Accepted Submission(s): 4302

Problem Description

You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.

Input

The first line of the input file contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string.

Output

There should be one line per test case containing the length of the largest string found.

Sample Input

2
3
ABCD
BCDFF
BRCD
2
rose
orchid

Sample Output

2
2

思路:要求最长公共连续字串的,必然要从原来的最短的串那个入手,先找出那个序列,暴力分析所有的情况,一一匹配最大的情况,匹配连续序列时,可以用stl

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <string>
#include <algorithm>

const int inf = (1<<31)-1;
const int MAXN = 1e2+10;

using namespace std;

string s[MAXN];

int main()
{
    int t,n,ti,mmin;
    string ts1,ts2;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        mmin = inf;
        for(int i=0;i<n;i++){
            //scanf("%s",s[i]);
            cin>>s[i];
            if(s[i].length()<mmin){
                mmin = s[i].length();
                ti = i;
            }
        }
        int mmax = 0,k;
      /*  for(int i=mmin;i>0;i--){
            for(int j=0;j<mmin-i+1;j++){
                ts1 = s[ti].substr(j,i); //startpos lenth
                ts2 = ts1;
                reverse(ts2.begin(),ts2.end());
               // cout<<ts1<<" "<<ts2<<endl;
                for(k=0;k<n;k++){
                    if(s[k].find(ts1,0)==-1&&s[k].find(ts2,0)==-1)
                        break;
                }

                if(k==n&&mmax<ts1.length())
                    mmax = ts1.length();
            }
        }*/
        char ms1[MAXN],ms2[MAXN];
        for(int i=0;i<mmin;i++){
            for(int j=i;j<mmin;j++){
                int b = 0;
                for(int w=i;w<=j;w++){
                    ms1[b] = s[ti][w];
                    ms2[b] = s[ti][j-b];
                    b++;
                }
                //cout<<ms1<<" "<<ms2<<endl;
                ms1[b] = ms2[b] = ‘\0‘;
                //printf("%s %s\n",ms1,ms2);
                for(k=0;k<n;k++){
                    if(s[k].find(ms1,0)==-1&&s[k].find(ms2,0)==-1){
                        break;

                    }
                }
                if(k==n&&mmax<b)
                    mmax = b;
            }
        }
        cout<<mmax<<endl;
    }
    //cout << "Hello world!" << endl;
    return 0;
}
/*
3
123
23333
12222
*/

时间: 2024-11-04 19:58:10

连续子序列的模板 stl的相关文章

HDU_1231(最大连续子序列)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1231 这道题是一道最大连续子序列的模板题,但是它要求输出首尾元素,那么如何找到首尾元素是关键,最大子序列的尾元素比较好找,记录最大的dp,该序号就是最大结点的序号,最小元素序号逆推,当dp第一次小于0的时候,它的下一个元素一定开启了新的一段.注意一下和为0的情况这种特殊情况判断. 动态转移方程为 B[K] = MAX(B[K-1]+A[K] , A[K])(B[K]为以k为最后元素的最大和,那么它的

最大连续子序列和

对于给定的数组 numnum,一个长度为 ss 的连续子序列是指由 num_i,num_{i+1},num_{i+2}\ldots,num_{i+s-1}num?i??,num?i+1??,num?i+2??…,num?i+s−1?? 组成的序列.数组中的元素有可能为正数.负数或 00.你需要从数组中找出元素总和最大的一个连续子序列. 比如,对于数组 1,-3,2,6,-5,81,−3,2,6,−5,8,其最大连续子序列之和是 2+6-5+8=112+6−5+8=11. 对于一段区间内的最大连续

hdu1231 最大连续子序列

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22849    Accepted Submission(s): 10135 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

dp-最大连续子序列的和

什么是最大连续子序列和呢 ? 最大连续子序列和是所有子序列中元素和最大的一个 . 问题 : 给定一个序列 { -2, 11, -4, 13, -5, -2 } , 则最大连续子序列和为 20 , 即 { 11 , -4 , 13 } . 分析 : 要怎样去解决这个问题呢 ? 设出 两个变量 , 一个 ans 用来存放最终的结果 , 一个用来现在对元素进行加和 , 每当有最大的和则更形下 ans . 代码示例 : #include <iostream> #include <cstring&

HDU1231 最长连续子序列

最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 31687    Accepted Submission(s): 14214 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j

动态规划:最大连续子序列和

问题:给出一个数组,求其连续子序列的最大和 package 动态规划; /** * 给出一个数组,求其连续子数组的最大和 * @author Administrator * */ public class MaxSum { public static void main(String[] args) { int[] arr = new int[]{-3,1,-3,4,-1,2,1}; int max=arr[0]; int current=arr[0]; for(int i=1;i<arr.le

UVa 108 - Maximum Sum(最大连续子序列)

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=44  Maximum Sum  Background A problem that is simple to solve in one dimension is often much more difficult to solve in more th

[pythontip]最大非连续子序列

题目链接:http://www.pythontip.com/coding/code_oj_case/36给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和. 这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻. 例如,对于L=[2,-3,3,50], 输出52(分析:很明显,该列表最大非连续子序列为[2,50]). dp首先复制L序列的元素,然后比较前两个元素,确定最优解赋值给dp[1]. 1 # L=[2,-3

最大连续子序列乘积

问题描述 给定一个整数序列(可能有正数,0和负数),求它的一个最大连续子序列乘积.比如给定数组a={3, -4, -5, 6, -2},则最大连续子序列乘积为360,即3*(-4)*(-5)*6=360. 分析 求最大连续子序列乘积与最大连续子序列和问题有所不同,因为其中有正有负还有可能有0. 假设数组为a[],直接利用动归来求解,考虑到可能存在负数的情况,我们用Max[i]来表示以a[i]结尾的最大连续子序列的乘积值,用Min[i]表示以a[i]结尾的最小的连续子序列的乘积值,那么状态转移方程