1. 程式人生 > >hdu 6208 hash字串水題

hdu 6208 hash字串水題

The Dominator of Strings

Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 2694    Accepted Submission(s): 975


Problem Description Here you have a set of strings. A dominator is a string of the set dominating all strings else. The string S is dominated by T
 if S is a substring of T.
Input The input contains several test cases and the first line provides the total number of cases.
For each test case, the first line contains an integer N indicating the size of the set.
Each of the following N lines describes a string of the set in lowercase.
The total length of strings in each case has the limit of 100000
.
The limit is 30MB for the input file.
Output For each test case, output a dominator if exist, or No if not.
Sample Input 3 10 you better worse richer poorer sickness health death faithfulness youbemyweddedwifebetterworsericherpoorersicknesshealthtilldeathdouspartandpledgeyoumyfaithfulness 5 abc cde abcde abcde bcde 3 aaaaa aaaab aaaac
Sample Output youbemyweddedwifebetterworsericherpoorersicknesshealthtilldeathdouspartandpledgeyoumyfaithfulness abcde No
Source 題意:給定一系列的字串,讓找出一個字串,可以包含其他所有的字串。

思路:找出最長的那個字串,對它進行hash,它一定是可能滿足條件的,如果對於最長的長度有多個字串,如果存在滿足條件的字串,那麼這幾個等長的字串一定相同。對於其他的字串,判斷最長的字串中是否含有其他字串就行了。(用最原始的暴力就能過, 可能是因為沒有大的資料)。

程式碼:

#include <stdio.h>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include<queue>
#include<iostream>
#include<list>
using namespace std;
typedef unsigned long long ull;
const int N = 1e5+5;
const int X = 163;
ull hhash[N], p[N];
char str[N];
char temp[N];
ull value[N];
int length[N];
int m;
void inIt() {
    p[0] = 1;
    for(int i = 1; i <= N - 5; i++)
        p[i] = p[i-1] * X;
}

ull get(int l, int r, ull g[]) {
    return g[r] - g[l-1]*p[r-l+1];
}

int main() {
    inIt();
    int t, index, Max, flag, len;
    ull sum;
    scanf("%d", &t);
    while(t--) {
        scanf("%d", &m);
        Max = 0;
        for(int i = 1; i <= m; i++) {
            scanf("%s", str);
            len = strlen(str);
            if(len > Max) {
                Max = len;
                strcpy(temp, str);
            }
            sum = 0;
            for(int j = 1; j <= len; j++)
                sum = sum * X + (str[j-1] - 'a');
            value[i] = sum;
            length[i] = len;
        }
        hhash[0] = 0;
        for(int i = 1; i <= Max; i++) {
            hhash[i] = hhash[i-1]*X + (temp[i-1] - 'a');
        }
        
        for(int i = 1; i <= m; i++) {
            flag = 0;
            len = length[i];
            for(int k = 1; k <= Max-len+1; k++) {
                if(value[i] == get(k, k+len-1, hhash)) {
                    flag = 1;
                    break;
                }
            }
            if(!flag) {
                break;
            }         
        }
        if(flag) {
            printf("%s\n", temp);
        }
        else 
            printf("No\n");
    }
    return 0;
}


相關推薦

hdu 6208 hash字串

The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 2694

hdu 1039 (字串

不滿足的標記,純水 #include <iostream> #include <cstdio> #include <cstring> using namespace std; int main() { char s[25];

hdu 5510 Bazinga (字串

題意很簡單:輸入n 然後輸入n個字串,求最大的i, 要求1 ~ i-1 中至少有一個串不是i的子串 思路:直接遍歷就行,兩個for迴圈巢狀(注意,都是自上而下開始),用strstr判斷是不是子串,

1217: 01字串 []

ace label 技術 std i++ ima -i arc 試題 1217: 01字串 [水題] 時間限制: 1 Sec 內存限制: 128 MB提交: 116 解決: 93 統計 題目描述 對於長度為5位的一個01串,每一位都可能是0或1,一共有32種可

hdu 2614 Beat (dfs)

題意很簡單,一個人喜歡做ACM題,現在有n道題,做完每道題需要一個時間,比如做完第一題用了i分鐘,那麼他要做的下一題花費的時間j要保證j>=i。不然他不做。問最多能做幾題。 很清晰的dfs題目,資料弱到暴力都可以過(有人測過)。因為題目簡單,嘗試了一下之前不是很熟練的遞迴dfs(因為

【洛谷2264】情書(字串

點此看題面 大致題意: 給你nnn個關鍵詞和一個文字串。讓你求出這些單詞在這個文字串中總共出現次數(一句話中同一單詞只算一次)。 細節 這題其實還是比較水的,一道很簡單的TrieTrieTrie題(資

hdu 4493 Tutor(+讀

Tutor Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 4780    Accepted Submissio

hdu 2043 密碼 (

網上流傳一句話:"常在網上飄啊,哪能不挨刀啊~"。其實要想能安安心心地上網其實也不難,學點安全知識就可以。 首先,我們就要設定一個安全的密碼。那什麼樣的密碼才叫安全的呢?一般來說一個比較安全的密碼至少應該滿足下面兩個條件: (1).密碼長度大於等於8,且不要超過16。 (2).密碼中的字元應該來自下面“字

字串】HDU2617Happy 2009

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=2617 Problem Description No matter you know me or not. Bless you happy in 2009. Input

HDU--1228:A+B ()

2. 原始碼: //HOJ--1228:A+B #include<iostream> #include<string> #include<memory.h> using namespace std; int cmp(string a

字串

題目描述 給出一個長度為n的字串(1<=n<=100000),求有多少個連續字串中所有的字母都出現了偶數次。 輸入 第一行一個正整數T,表示資料組數(1 <= T <= 10)。 接下來T行,每行有一個只包含小寫字母的字串。 輸出

HDU - 2072 】單詞數(字串讀入技巧,sstream大法,字串讀入格式)

題幹: lily的好朋友xiaoou333最近很空,他想了一件沒有什麼意義的事情,就是統計一篇文章裡不同單詞的總數。下面你的任務是幫助xiaoou333解決這個問題。 Input 有多組資料,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,遇到#時表示

hdu 1236 排名 (字串處理)

排名 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi

HDU 2017 字串統計(

字串統計 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi

Dijkstra算法---HDU 2544 (模板)

fin size out hdu 2544 %d stdio.h stream 之間 sizeof /* 對於只會弗洛伊德的我,迪傑斯特拉有點不是很理解,後來發現這主要用於單源最短路,稍稍明白了點,不過還是很菜,這裏只是用了鄰接矩陣 套模板,對於鄰接表暫時還,,,沒做題,後

杭電(hdu)2053 Switch Game

center ++ class chang names top weight ext == Switch Game Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J

hdu 5538 House Building(長春現場賽——

onos white ng- ron number ots 1.7 mage time 題目鏈接:acm.hdu.edu.cn/showproblem.php?pid=5538 House Building Time Limit: 2000/1000

HDU 5744 Keep On Movin (思維)

amp tle 輸出 ngs pro ber end use view Problem Description Professor Zhang has kinds of characters and the quantity of the i-th character is

HDU 1017 A Mathematical Curiosity (枚舉)

tracking tween hat string include -m add des tom Problem Description Given two integers n and m, count the number of pairs of in

HDU 6182 A Math Problem

std 水題 div 輸出 iterator code php else fin   題目鏈接: http://acm.hdu.edu.cn/showproblem.php?pid=6182   題目描述: 輸入N, 輸出滿足k^k <= N 的 k的個數   解題思