1. 程式人生 > >CCF 201409-3 字串匹配

CCF 201409-3 字串匹配

試題編號: 201409-3
試題名稱: 字串匹配
時間限制: 1.0s
記憶體限制: 256.0MB
問題描述:

問題描述

  給出一個字串和多行文字,在這些文字中找到字串出現的那些行。你的程式還需支援大小寫敏感選項:當選項開啟時,表示同一個字母的大寫和小寫看作不同的字元;當選項關閉時,表示同一個字母的大寫和小寫看作相同的字元。

輸入格式

  輸入的第一行包含一個字串S,由大小寫英文字母組成。   第二行包含一個數字,表示大小寫敏感的選項,當數字為0時表示大小寫不敏感,當數字為1時表示大小寫敏感。   第三行包含一個整數n,表示給出的文字的行數。   接下來n行,每行包含一個字串,字串由大小寫英文字母組成,不含空格和其他字元。

輸出格式

  輸出多行,每行包含一個字串,按出現的順序依次給出那些包含了字串S的行。

樣例輸入

Hello 1 5 HelloWorld HiHiHelloHiHi GrepIsAGreatTool HELLO HELLOisNOTHello

樣例輸出

HelloWorld HiHiHelloHiHi HELLOisNOTHello

樣例說明

  在上面的樣例中,第四個字串雖然也是Hello,但是大小寫不正確。如果將輸入的第二行改為0,則第四個字串應該輸出。

評測用例規模與約定

  1<=n<=100,每個字串的長度不超過100。

用了kmp演算法。沒試過BF,不知道會不會超時。

#include <iostream>
#include <cstring>
#include <cmath>

const int maxn = 105;
int next[maxn];

void findNext(char p[]);

using namespace std;

int main()
{
    int lenStr,lenP,n;
    char str[maxn];
    char p[maxn];
    cin >> p;
    int choice;
    cin >> choice;
    findNext(p);
    lenP = strlen(p);
    cin >> n;
    if(choice == 1)
    {
        for(int k = 0; k < n; k++)
        {
            cin >> str;
            int i =0,j = 0;
            lenStr = strlen(str);
            while(i < lenStr&&j < lenP)
            {
                if(j == -1||str[i] == p[j])
                {
                    i++;
                    j++;
                }
                else
                {
                    j = next[j];
                }
            }
            if(j == lenP)
            {
                cout << str << endl;
            }
        }
    }
    else
    {
        for(int k = 0; k < n; k++)
        {
            cin >> str;
            lenStr = strlen(str);
            int i =0,j = 0;
            while(i < lenStr&&j < lenP)
            {
                if(j == -1||str[i] - p[j] == 0||abs(str[i] - p[j]) == 32)
                {
                    i++;
                    j++;
                }
                else
                {
                    j = next[j];
                }
            }
            if(j == lenP)
            {
                cout << str << endl;
            }
        }
        return 0;
    }
}
void findNext(char p[])
{
    int lenP = strlen(p);
    next[0] = -1;
    int k = -1;
    int j = 0;
    while(j < lenP)
    {
        if(k == -1||p[k] == p[j])
        {
            next[++j] = ++k;
        }
        else
        {
            k = next[k];
        }
    }
}