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[4001][N];
 8
 9 int KMP(int n,char*a,int m,char*b){
10     int i,j;
11     for(nxt[0]=j=-1,i=1;i<n;nxt[i++]=j){
12         while(~j&&a[j+1]!=a[i])j=nxt[j];
13         if(a[j+1]==a[i])j++;
14     }
15     for(j=-1,i=0;i<m;i++){
16         while(~j&&a[j+1]!=b[i])j=nxt[j];
17         if(a[j+1]==b[i])j++;
18         if(j==n-1)return 1;
19     }
20     return 0;
21 }
22
23 inline void up(int &a,int b){if(a<b)a=b;}
24 inline void update(int L,int R){
25     if(R-L+1>ans)l=L,r=R,ans=r-l+1;
26     else if(R-L+1==ans)
27     {
28         for(int i=l,j=L;1;i++,j++){
29             if(dt[1][i]!=dt[1][j]){
30                 if(dt[1][i]<dt[1][j])return;
31                 else{
32                     l=L,r=R;
33                     return;
34                 }
35             }
36             if(i==r)return;
37             if(j==R)l=L,r=R;
38         }
39     }
40 }
41
42 int main(){
43     while(~scanf("%d",&n),n)
44     {
45         F(i,1,n)scanf("%s",dt[i]),lens[i]=strlen(dt[i]);
46         char tp[201];
47         ans=-1,l=0,r=0,cnt=0;
48         F(i,0,lens[1]-1)F(j,i+cnt,lens[1]-1)
49         {
50
51             int ed=0,fg=1;
52             F(ii,i,j)tp[ed++]=dt[1][ii];
53             F(ii,2,n)if(KMP(j-i+1,tp,lens[ii],dt[ii])==0){fg=0;break;}
54             if(fg)update(i,j),cnt=ans<1?0:ans-1;//剪枝,每次只找大于ans的
55         }
56         if(ans==-1)puts("IDENTITY LOST");
57         else {F(i,l,r)printf("%c",dt[1][i]);puts("");}
58     }
59     return 0;
60 }

时间: 2024-10-12 21:10:17

hdu_2328_Corporate Identity(暴力枚举子串+KMP)的相关文章

字符串截取模板 &amp;&amp; POJ 3450、3080 ( 暴力枚举子串 &amp;&amp; KMP匹配 )

//截取字符串 ch 的 st~en 这一段子串返回子串的首地址 //注意用完需要根据需要最后free()掉 char* substring(char* ch,int st,int en) { int length = en - st + 1; char* pch=ch; char* subch=(char*)malloc(length+1); pch=pch+st; for(int i=0;i<length;i++) subch[i]=*(pch++); subch[length]='\0';

hdu-2328(暴力枚举+kmp)

题意:给你n个字符串,问你这n个串的最长公共子串 解题思路:暴力枚举任意一个字符串的所有子串,然后暴力匹配,和hdu1238差不多的思路吧,这里用string解决的: 代码: #include<iostream> #include<string> #include<cstdio> #include<algorithm> using namespace std; string t; int main() { int n; string a[4050]; ios

hdu2328 Corporate Identity【string库使用】【暴力】【KMP】

Corporate Identity Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3308    Accepted Submission(s): 1228 Problem Description Beside other services, ACM helps companies to clearly state their "cor

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

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

hdu5616 暴力枚举

2017-08-25 20:08:54 writer:pprp 题目简述: ? HDU 5616? n个砝码,可以放在天平左右两侧或不放? m次询问,每次询问是否可以测出给定重量? 1 ≤ n ≤ 20? 1 ≤ m ≤ 100 这道题采用枚举的思路的话实现起来还是有点困难的, 要实现的功能是对每个砝码进行处理,加到左边, 加到右边,或者是不加 看了大神的代码,感觉很巧妙, 设置了两个标记数组 vis1[2005], vis2[2005] 一个vis1用来记录当前已经可以实现的重量 另一个vis

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

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&

HDU 4770 Lights Against Dudely 暴力枚举+dfs

又一发吐血ac,,,再次明白了用函数(代码重用)和思路清晰的重要性. 11779687 2014-10-02 20:57:53 Accepted 4770 0MS 496K 2976 B G++ czy Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1360    Accepted Subm

ZOJ3818-Pretty Poem(暴力枚举)

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