zoukankan      html  css  js  c++  java
  • HDU 5510:Bazinga(暴力KMP)

    http://acm.hdu.edu.cn/showproblem.php?pid=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 (1in) such that there exists an integer j (1j<i) and Sj is not a substring of Si.

    A substring of a string Si is another string that occurs in Si. For example, ``ruiz" is a substring of ``ruizhang", and ``rzhang" is not a substring of ``ruizhang".
     
    Input
     
    The first line contains an integer t (1t50) which is the number of test cases.
    For each test case, the first line is the positive integer n (1n500) and in the following n lines list are the strings S1,S2,,Sn.
    All strings are given in lower-case letters and strings are no longer than 2000 letters.
     
    Output
     
    For each test case, output the largest label you get. If it does not exist, output 1.
     
    Sample Input
     
    4
    5
    ab
    abc
    zabc
    abcd
    zabcd
    4
    you
    lovinyou
    aboutlovinyou
    allaboutlovinyou
    5
    de
    def
    abcd
    abcde
    abcdef
    3
    a
    ba
    ccc
     
    Sample Output
     
    Case #1: 4
    Case #2: -1
    Case #3: 4
    Case #4: 3

    题意:给出n个串,求出最大的i使得有一个j(1<=j<i)不是i的子串。

    思路:比赛的时候由于没剩下多少时间,写的太暴力了TLE,后面自己写了一个,发现别人写的也很暴力,还有用strstr过的,速度普遍比用KMP的快。

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 #define M 2010
     6 #define N 510
     7 int nxt[M];
     8 char s[N][M];
     9 
    10 void make_next(char *s)
    11 {
    12     memset(nxt, 0, sizeof(nxt));
    13     int j = -1, i = 0;
    14     nxt[0] = -1;
    15     int len = strlen(s);
    16     while(i < len) {
    17         if(j == -1 || s[i] == s[j]) {
    18             i++; j++;
    19             nxt[i] = j;
    20         } else {
    21             j = nxt[j];
    22         }
    23     }
    24 }
    25 
    26 int kmp(char *s, char *str)
    27 {
    28     make_next(s);
    29     int l = strlen(s), len = strlen(str);
    30     int i = 0, j = 0;
    31     while(i < len && j < l) {
    32         if(j == -1 || str[i] == s[j]) {
    33             i++; j++;
    34             if(j >= l) return true;
    35         } else {
    36             j = nxt[j];
    37         }
    38     }
    39     return false;
    40 }
    41 
    42 int main()
    43 {
    44     int t;
    45     int cas = 0;
    46     scanf("%d", &t);
    47     while(t--) {
    48         int n;
    49         scanf("%d", &n);
    50         for(int i = 1; i <= n; i++)
    51             scanf("%s", s[i]);
    52 
    53         int tmp = -100;
    54         for(int i = n; i > 1; i--){
    55             if(!kmp(s[i-1], s[i])) {
    56                  tmp = i;
    57                  break;
    58             }
    59         }
    60 //        printf("TMP : %d
    ", tmp);
    61         int ans = tmp;
    62         for(int i = tmp - 1; i > 0; i--) {
    63             while(!kmp(s[i], s[ans+1]) && ans < n) {
    64                 ans++;
    65             }
    66         }
    67 
    68         printf("Case #%d: ", ++cas);
    69         if(tmp != -100)
    70             printf("%d
    ", ans);
    71         else
    72             printf("-1
    ");
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    啊,好久没更新了,今天分享一个小工具,两个方法,转换字节数组成十六进制字符串
    Oracle的关于建表,约束,查询等的练习
    Oracle的完整练习,纯手工打字,可能有一两点错误。。。
    Oracle的用户管理,授权及备份
    Oracle视图,序列及同义词、集合操作
    Oracle的总体回顾
    Oracle表管理
    Oracle基本代码学习
    网上B2C书城,1.0javaWEB版!!好几天没更新了,都忙着做那个网站了~
    Daily Scrum 12.23
  • 原文地址:https://www.cnblogs.com/fightfordream/p/5717264.html
Copyright © 2011-2022 走看看