hdu-1238(kmp+枚举)

题意:给你n个字符串,问你这里面最长的公共子串的长度是多少,一个公共子串的反串也算,比如样例二;

解题思路:随便找一个字符,枚举它的子串然后跑kmp就行了,很多人的博客都是用string类里面的函数来解决的,学到了。。。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define maxn 205
using namespace std;
char x[maxn][maxn];
char str[maxn];
char str2[maxn];
int next1[maxn];
int cnt,cot;
void get_next(char *t)
{
    int j,k;
    int tlen=cnt;
    j=0;k=-1;next1[0]=-1;
    while(j<tlen)
    {
        if(k==-1||t[j]==t[k])
            next1[++j]=++k;
        else
            k=next1[k];
    }
}
int kmp_pos(char *t,char *s)
{
    int slen=strlen(s);
    int tlen=cnt;
    int i=0,j=0;
    get_next(t);
    while(i<slen&&j<tlen)
    {
        if(j==-1||s[i]==t[j])
        {
            i++;j++;
        }
        else
            j=next1[j];
    }
    if(j==tlen)
        return i-tlen;
    return -1;

}
int main()
{
    int tt;
    int n;
    int ans;
    int maxx;
    int l;
    scanf("%d",&tt);
    while(tt--)
    {
        maxx=-1;l=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%s",x[i]);
        int m=strlen(x[1]);
        for(int i=0;i<m;i++)
        {
            cnt=0;
            for(int j=i;j<m;j++)
            {
                ans=0;cot=0;
                str[cnt++]=x[1][j];
                for(int k=cnt-1;k>=0;k--)
                str2[cot++]=str[k];
                /*for(int k=0;k<cnt;k++)
                    cout<<str[k];
                cout<<endl;
                for(int k=0;k<cnt;k++)
                    cout<<str2[k];
                cout<<endl;*/
                for(int k=1;k<=n;k++)
                {
                    int flag1=kmp_pos(str,x[k]);
                    int flag2=kmp_pos(str2,x[k]);
                    if(flag1==-1&&flag2==-1)
                        continue;
                    ans++;

                }
                if(ans==n)
                {
                    l=max(l,cot);
                }
            }
        }
        printf("%d\n",l);

    }
}

  

原文地址:https://www.cnblogs.com/huangdao/p/9483414.html

时间: 2024-10-15 15:15:59

hdu-1238(kmp+枚举)的相关文章

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 1711 KMP模板题

// hdu 1711 KMP模板题 // 贴个KMP模板吧~~~ #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; const int MAX_N = 1000008; const int MAX_M = 10008; int T[MAX_N]; int p[MAX_M]; int f[MAX_M]; int

hdu 1686 KMP模板

1 // hdu 1686 KMP模板 2 3 // 没啥好说的,KMP裸题,这里是MP模板 4 5 #include <cstdio> 6 #include <iostream> 7 #include <cstring> 8 #include <algorithm> 9 10 using namespace std; 11 12 const int MAX_N = 1000008; 13 const int MAX_M = 10008; 14 char T

Cyclic Nacklace HDU 3746 KMP 循环节

Cyclic Nacklace HDU 3746 KMP 循环节 题意 给你一个字符串,然后在字符串的末尾添加最少的字符,使这个字符串经过首尾链接后是一个由循环节构成的环. 解题思路 next[len]-len的差即是循环部分的长度. 这个是重点.这个题目自己开始没有想明白,看的博客,推荐这个. 代码实现 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const i

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 (水)

题目链接: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 1711 KMP算法模板题

题意:给你两个串,问你第二个串是从第一个串的什么位置開始全然匹配的? kmp裸题,复杂度O(n+m). 当一个字符串以0为起始下标时.next[i]能够描写叙述为"不为自身的最大首尾反复子串长度". 当发生失配的情况下,j的新值next[j]取决于模式串中T[0 ~ j-1]中前缀和后缀相等部分的长度, 而且next[j]恰好等于这个最大长度. 防止超时.注意一些细节.. 另外:尽量少用strlen.变量记录下来使用比較好,用字符数组而不用string //KMP算法模板题 //hdu

HDU 6103 Kirinriki 枚举长度 尺取法

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6103 题目描述: 定义两个相同长度的字符串的值为首尾开始字符串的ASCII相减, 求一个字符串中任取两个相同长度的不重叠的值不超过m的最大长度 解题思路: 求连续区间不超过某一个上限或者不低于某个下限的应该用尺取法 ,复杂度为O(n),  本题n是5000所以O(n^2)可行, 枚举前缀和后缀(通过枚举前缀, 再将字符串翻转枚举前缀进行), 再进行尺取 代码:  代码中有注释 #include <