zoukankan      html  css  js  c++  java
  • hdu1238 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): 10245    Accepted Submission(s): 4879


    Problem Description
    You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings.
     
    Input
    The first line of the input file contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains a single integer n (1 <= n <= 100), the number of given strings, followed by n lines, each representing one string of minimum length 1 and maximum length 100. There is no extra white space before and after a string. 
     
    Output
    There should be one line per test case containing the length of the largest string found.
     
    Sample Input
    2 3 ABCD BCDFF BRCD 2 rose orchid
     
    Sample Output
    2 2
     
    Author
    Asia 2002, Tehran (Iran), Preliminary
     
    Recommend
    Eddy
    思路:暴力枚举+kmp
     1 #include <bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define MP make_pair
     6 #define PB push_back
     7 typedef long long LL;
     8 typedef pair<int,int> PII;
     9 const double eps=1e-8;
    10 const double pi=acos(-1.0);
    11 const int K=1e6+7;
    12 const int mod=1e9+7;
    13 
    14 int nt[K];
    15 char sa[105][105],sb[105],sc[105];
    16 void kmp_next(char *T,int *next)
    17 {
    18     next[0]=0;
    19     for(int i=1,j=0,len=strlen(T);i<len;i++)
    20     {
    21         while(j&&T[i]!=T[j]) j=next[j-1];
    22         if(T[i]==T[j])  j++;
    23         next[i]=j;
    24     }
    25 }
    26 int kmp(char *S,char *T,int *next)
    27 {
    28     int ans=0;
    29     int ls=strlen(S),lt=strlen(T);
    30     kmp_next(T,next);
    31     for(int i=0,j=0;i<ls;i++)
    32     {
    33         while(j&&S[i]!=T[j]) j=next[j-1];
    34         if(S[i]==T[j])  j++;
    35         if(j==lt)   ans++;
    36     }
    37     return ans;
    38 }
    39 int main(void)
    40 {
    41     int t,n;cin>>t;
    42     while(t--)
    43     {
    44         cin>>n;
    45         for(int i=1;i<=n;i++)
    46             scanf("%s",sa[i]);
    47         int len=strlen(sa[1]),ans=0;
    48         for(int i=0;i<len;i++)
    49         {
    50             for(int j=i;j<len;j++)
    51             {
    52                 int ff=1;
    53                 sb[j-i]=sa[1][j],sb[j-i+1]='';
    54                 if(j-i+1<=ans)continue;
    55                 for(int k=j;k>=i;k--)
    56                     sc[j-k]=sa[1][k];
    57                 sc[j-i+1]='';
    58                 for(int k=2;k<=n&&ff;k++)
    59                 if(!kmp(sa[k],sb,nt)&&!kmp(sa[k],sc,nt))
    60                     ff=0;
    61                 if(ff)
    62                     ans=j-i+1;
    63             }
    64         }
    65         printf("%d
    ",ans);
    66     }
    67     return 0;
    68 }
  • 相关阅读:
    编程之美-2.18 数组分割
    话题模型
    暂时跳过的Leetcode题目
    LDA主题模型
    二叉树非递归的统一实现
    取余和取模运算
    IDM非补丁破解方法
    两种建立堆的方法HeapInsert & Heapify
    非阻塞connect:Web客户程序
    非阻塞connect
  • 原文地址:https://www.cnblogs.com/weeping/p/6669813.html
Copyright © 2011-2022 走看看