HDU 1238 Substrings (水)

Posted EricJeffrey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 <cassert>
  7 #include <cstdio>
  8 #include <cctype>
  9 #include <vector>
 10 #include <string>
 11 #include <queue>
 12 #include <stack>
 13 #include <cmath>
 14 #include <map>
 15 #include <set>
 16 using namespace std;
 17 #define rep(i,a,n) for (int i=a;i<n;i++)
 18 #define per(i,a,n) for (int i=n-1;i>=a;i--)
 19 #define pb push_back
 20 #define mp make_pair
 21 #define all(x) (x).begin(),(x).end()
 22 #define fi first
 23 #define se second
 24 #define SZ(x) ((int)(x).size())
 25 typedef vector<int> VI;
 26 typedef long long ll;
 27 typedef pair<int, int> PII;
 28 const ll mod = 1000000007;
 29 ll powmod(ll a, ll b) { ll res = 1; a %= mod; assert(b >= 0); for (; b; b >>= 1) { if (b & 1)res = res*a%mod; a = a*a%mod; }return res; }
 30 // head
 31 const int inf = 0x3f3f3f3f;
 32 #define maxn 105
 33 char s[maxn][maxn];
 34 int n;
 35 
 36 bool sstr(char tms[maxn], int tmpos){
 37     bool flag = false;
 38     
 39     for(int k = 0; k < n; k++){
 40         if(k == tmpos) continue;
 41         int tmslen = strlen(tms), i = 0, j = 0;
 42         int tmbslen = strlen(s[k]);
 43         bool tmflag = false;
 44         for(int i = 0; i < tmbslen; i++){
 45             int tmi = i;
 46             while(s[k][i] == tms[j] && j < tmslen){
 47                 i++, j++;
 48             }
 49             if(j != tmslen){
 50                 j = 0;
 51                 i = tmi;
 52             }
 53             else{
 54                 tmflag = true;
 55                 break;
 56             }
 57         }
 58         if(!tmflag)
 59             return false;
 60     }
 61     return true;
 62 }
 63 
 64 int main(){
 65     int t;
 66     scanf("%d", &t);
 67     while(t--){
 68         memset(s, 0, sizeof(s));
 69         scanf("%d", &n);
 70         int minlen = inf, mini;
 71         for(int i = 0; i < n; i++){
 72             scanf("%s", s[i]);
 73             int tmlen = strlen(s[i]);
 74             if(tmlen < minlen){
 75                 minlen = tmlen;
 76                 mini = i;
 77             }
 78         }
 79         int ans = 0, len = minlen;
 80         char ss[maxn]; memcpy(ss, s[mini], sizeof(s[mini]));
 81         
 82         for(int i = 0; i < len; i++){
 83             for(int j = i; j < len; j++){
 84                 //temporary string
 85                 int tmlen = j - i + 1;
 86                 char tms[maxn];
 87                 strncpy(tms, ss + i, tmlen);
 88                 tms[tmlen] = \0;
 89                 if(sstr(tms, mini)){
 90                     ans = max(ans, tmlen);
 91                 }
 92                 //swap the string
 93                 for(int k = 0; k < (tmlen) / 2; k++){
 94                     swap(tms[k], tms[tmlen - k - 1]);
 95                 }
 96                 if(sstr(tms, mini)){
 97                     ans = max(ans, tmlen);
 98                 }
 99             }
100         }
101         printf("%d\n", ans);
102     }
103     
104 }

题目:

Substrings

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10400    Accepted Submission(s): 4959


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

以上是关于HDU 1238 Substrings (水)的主要内容,如果未能解决你的问题,请参考以下文章

hdu1238 Substrings 扩展KMP

kuangbin专题十六 KMP&&扩展KMP HDU1238 Substrings

hdu-1238(kmp+枚举)

hdu1238 kmp

hdu 1238 字符串处理 暴力

Distinct Substrings SPOJ - DISUBSTR(后缀数组水题)