HDU 1238 Substing

思路:

1.找出n个字符串中最短的字符串Str[N]

2.从长到短找Str[N]的子子串 subStr[N],以及subStr[N]的反转字符串strrev(subStr[N]);(从长到短是做剪枝处理)

3.用strstr()函数遍历所有的字符串,看是否含有此子子串subStr[N]或strrev(subStr[N]);只要有一个字符串不包含subStr[N]或strrev(subStr[N])就放弃这个子串,尝试下一个;

4.找到第一个满足要求的就输出strlen(subStr[N])或者strlen(strrev(subStr[N]));  这里可以用string.h头问件中的一个函数strncpy(str1, str2, n);功能:将字符串2中的最多n个字符复制到字符数组1中;

这里可以直接返回n;

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<queue>
#include<stack>
#include<math.h>
#include<vector>
#include<stdlib.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 110
struct MAZE
{
    char str[N];
    int len;
} maze[N];

bool cmp(MAZE x, MAZE y)
{
    return x.len<y.len;
}

int solve(int n);
int Find(char str[], int n);
int main()
{
    int t, n;

    scanf("%d", &t);
    while(t--)
    {
        memset(maze, 0, sizeof(maze));
        scanf("%d", &n);
        for(int i=0; i<n; i++)
        {
            scanf("%s", maze[i].str);
            maze[i].len=strlen(maze[i].str);
        }
        sort(maze, maze+n,cmp);
        int ans=solve(n);
        printf("%d\n", ans);
    }
    return 0;
}

int solve(int n)
{
    char Str[N];
    for(int i=maze[0].len; i>0; i--)
    {
        strcpy(Str, maze[0].str);
        strcat(Str, maze[0].str);
        for(int j=0; j<maze[0].len; j++)
        {
            char subStr[N];
            memset(subStr, 0, sizeof(subStr));//必须初始化
           strncpy(subStr, Str+j, i);

            if(Find(subStr, n))
                return i;
            if(Find(strrev(subStr), n))
                return i;
        }
    }
    return 0;
}

int Find(char s[], int n)
{
    for(int i=1; i<n; i++)
    {
        if(!(strstr(maze[i].str, s)))
            return 0;
    }
    return 1;
}

  

时间: 2024-11-02 17:17:38

HDU 1238 Substing的相关文章

poj 1226 hdu 1238 Substrings 求若干字符串正串及反串的最长公共子串 2002亚洲赛天津预选题

题目:http://poj.org/problem?id=1226 http://acm.hdu.edu.cn/showproblem.php?pid=1238 其实用hash+lcp可能也可以,甚至可能写起来更快,不过我没试,我最近在练习后缀数组,所以来练手 后缀数组的典型用法之一----------------后缀数组+lcp+二分 思路:1.首先将所有的字符串每读取一个,就将其反转,作为一组,假设其下标为i到j,那么cnt[i]到cnt[j]都标记为一个数字(这个数字意思是第几个读入的字符

HDU 1238

好吧,这题直接搜索就可以了,不过要按照长度最短的来搜,很容易想得到. 记得ACM比赛上有这道题,呃..不过,直接搜..呵呵了,真不敢想. 1 #include <iostream> 2 #include <cstdio> 3 #include <string.h> 4 #include <algorithm> 5 using namespace std; 6 7 char str[105][105]; 8 char s1[105],s2[105]; 9 10

HDU 1238 Substrings (水)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1238 枚举最短字符串的的每个子串然后暴力....我能怎么办,我也很无奈啊 代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <functional> 3 #include <algorithm> 4 #include <iostream> 5 #include <cstring> 6 #include <ca

hdu 1238 Substrings (暴搜,枚举)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1238 Substrings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8391    Accepted Submission(s): 3862 Problem Description You are given a number of

HDU 1238 (暴力反转KMP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1238 题意:给定n个字符串,求它们的最长连续子序列,值得注意的是,求的的子序列可以是反转的. 题解:直接记录出最短的字符串作为匹配串,其实用第一个也应该是可以的,然后不断的缩小其长度,知道能够匹配成功,如果匹配不成功,则把字符串反转,再找一次即可. Time:31ms Memory:1712KB reverse(s,s+n):字符串反转函数. 代码如下: 1 #include<cstdio> 2

hdu 1238 字符串处理 暴力

Substrings Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 13779    Accepted Submission(s): 6689http://acm.hdu.edu.cn/showproblem.php?pid=1238 Problem Description You are given a number of case-

Substrings - HDU 1238(最大共同子串)

题目大意:给你N个串,求出来他们的最大公共子串的长度(子串反过来也算他们的子串).   分析:很久以前就做过这道题,当时是用的strstr做的,不过相同的都是枚举了子串......还是很暴力,希望下次遇到类似的题目我已经掌握高效的方法了. ============================================================================== #include<stdio.h> #include<string.h> const i

hdu 2328 Corporate Identity(kmp)

Problem Description Beside other services, ACM helps companies to clearly state their “corporate identity”, which includes company logo but also other signs, like trademarks. One of such companies is Internet Building Masters (IBM), which has recentl

KMP 总结

再次回来总结KMP,发现有点力不从心,学久了,越觉得越来越不理解了. 估计是写KMP已经不下50遍了吧.每次用都是直接默写.. KMP算法,串模式匹配算法,通过预处理得到next数组,再进行匹配. 几个要重点记忆的地方: 1. next数组的含义 next[i] = t 表示以i位置结尾的前缀串(相对于原串是前缀串)的真前缀和真后缀相等的最大值为t 2. 最小覆盖子串: 我不会证明,但是记得住结论,记len表示字符串的长度,则这个字符串的最小覆盖子串为 len - next[len] 3. KM