hdu 5510

题意:给出n个字符串s[1]..s[n],问是否存在一个i使得s[j](1<=j<i)不是s[i]的子串,求最大i

思路:KMP+暴力

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=503;
 4 const int M=2003;
 5
 6 char s[N][M];
 7 bool vis[N];
 8 int Next[N][M];
 9 int len[N];
10 int n;
11 int ans;
12
13 void getNext(int x){
14     int j, k;
15     j = 0; k = -1; Next[x][0] = -1;
16     while(j < len[x])
17         if(k == -1 || s[x][j] == s[x][k])
18             Next[x][++j] = ++k;
19         else
20             k = Next[x][k];
21 }
22
23 int hh(int x,int y)//x是子串,y是母串
24 {
25     int i = 0, j = 0;
26     while(i < len[y] && j < len[x])
27     {
28         if(j == -1 || s[y][i] == s[x][j])
29         {
30             i++; j++;
31         }
32         else
33             j = Next[x][j];
34     }
35     if(j == len[x])
36         return i - len[x];
37     else
38         return -1;
39 }
40
41 void slove(){
42     memset(vis,0,sizeof(vis));
43     for(int i=1;i<=n;i++){
44         for(int j=i+1;j<=n;j++)if(!vis[j]){
45             if(hh(i,j)==-1) {
46                 vis[j]=1;ans=max(ans,j);
47             }
48             else break;
49         }
50     }
51 }
52 int main(){
53     int t;
54     cin>>t;
55     int k=1;
56     while(t--){
57         scanf("%d",&n);
58         ans=-1;
59         for(int i=1;i<=n;i++){
60             scanf("%s",s[i]);
61             len[i]=strlen(s[i]);
62             getNext(i);
63         }
64         slove();
65         printf("Case #%d: %d\n",k++,ans);
66
67     }
68 }
时间: 2024-11-06 01:16:35

hdu 5510的相关文章

hdu 5510 Bazinga(字符串kmp)

Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2287    Accepted Submission(s): 713 Problem Description Ladies and gentlemen, please sit up straight.Don't tilt your head. I'm serious.For

Bazinga HDU - 5510 不可做的暴力

http://acm.hdu.edu.cn/showproblem.php?pid=5510 想了很久队友叫我用ufs + kmp暴力过去了. fa[x] = y表示x是y的子串,所以只有fa[x] == x才需要kmp一次. 那么这样的话,如果全部都不互为子串的话,复杂度还是爆咋的. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <

【hdu 5510】【2015ACM/ICPC亚洲区沈阳站-重现赛 】Bazinga 题意&题解&代码(C++)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5510 题意: 给出n个字符串,求下标最大的字符串,存在下标小于它的字符串中有字符串不是他的子串. 题解: 首先能想到kmp+n^2暴力匹配,但是感觉会超时,因此我们需要加一些剪枝,水题,不要被他的数据范围吓到.. 代码: #include<iostream> #include<algorithm> #include<stdio.h> #include<string.

Hdu 5510 Bazinga(KMP+尺取法)

题目地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=5510 思路:设两个指针l.r,对于字符串a.b.c,若a为b的子串则下次比较时可直接比较b,c.枚举r,依次比较s[l]--s[r-1]是否为s[r]的子串,若s[i]为s[r]的子串,则l++.否则答案更新为r. #include<cstdio> #include<cstring> #include<iostream> #include<algorith

【HDU 5510 Bazinga】字符串

2015沈阳区域赛现场赛第2题 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 题意:给定一个由字符串组成的序列,一共n个元素,每个元素是一个不超过2000个字符的字符串.求"存在秩小于 i 且不是 i 的子串"的最大的 i (1<= i <= n). 数据范围:n [1, 500],T组输入,T [1, 50] 思路:从1到n-1枚举每个字符串str[i],判断是否有 j < i 使得str[j]不是str[i

hdu 5510 Bazinga (KMP+暴力标记)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5510 思路: 一开始直接用KMP莽了发,超时了,后面发现如果前面的字符串被后面的字符串包含,那么我们就不需要用前面的字符串去比较了,把他标记掉就好了. 实现代码: #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; char

HDU 5510 Bazinga(KMP)

Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 4572    Accepted Submission(s): 1459 Problem Description Ladies and gentlemen, please sit up straight. Don't tilt your head. I'm serious.F

HDU 5510 Bazinga (KMP)

题意:给定 n 个 字符串,让你找出最大的 r,使得存在一个 sl 不是sr的子串(l  < r). 析:KMP算法,不过直接暴力就别想了,肯定TLE,所以我们考虑一下,用两个指针 l, r,如果sl 不是 sr的字串,那么们就可以更新r,继续往后,直到找到最后. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string>

hdu 5510 Bazinga(暴力)

Problem Description Ladies and gentlemen, please sit up straight. Don't tilt your head. I'm serious. For n given strings S1,S2,?,Sn, labelled from 1 to n, you should find the largest i (1≤i≤n) such that there exists an integer j (1≤j<i) and Sj is not

hdu 5510 Bazinga (kmp+dfs剪枝) 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)

废话: 这道题很是花了我一番功夫.首先,我不会kmp算法,还专门学了一下这个算法.其次,即使会用kmp,但是如果暴力枚举的话,还是毫无疑问会爆掉.因此在dfs的基础上加上两次剪枝解决了这道题. 题意: 我没有读题,只是队友给我解释了题意,然后我根据题意写的题. 大概意思是给n个字符串,从上到下依次标记为1——n,寻找一个标记最大的串,要求这个串满足:标记比它小的串中至少有一个不是它的子串. 输入: 第一行输入一个整型t,表示共有t组数据. 每组数据首行一个整型n,表示有n个串. 接下来n行,每行