1. 程式人生 > >HDU 5745 La Vie en rose(暴力碾壓過去。。。)

HDU 5745 La Vie en rose(暴力碾壓過去。。。)

Problem Description

Professor Zhang would like to solve the multiple pattern matching problem, but he only has only one pattern string p=p1p2...pm. So, he wants to generate as many as possible pattern strings from p using the following method:

1. select some indices i1,i2,...,ik such that 1≤i1<i2<...<ik<|p| and |ij−ij+1|>1 for all 1≤j<k.
2. swap pij and pij+1 for all 1≤j≤k.

Now, for a given a string s=s1s2...sn, Professor Zhang wants to find all occurrences of all the generated patterns in s.

Input

There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case:

The first line contains two integers n and m (1≤n≤105,1≤m≤min{5000,n}) -- the length of s and p.

The second line contains the string s and the third line contains the string p. Both the strings consist of only lowercase English letters.

Outpu

For each test case, output a binary string of length n. The i-th character is "1" if and only if the substring sisi+1...si+m−1 is one of the generated patterns.

Sample Input

3
4 1
abac
a
4 2
aaaa
aa
9 3
abcbacacb
abc

Sample Output

1010
1110
100100100

這個題在當時做的時候是萬萬沒想到可以直接暴力的。。後來抱著試試的心態寫了一發居然過了。。人生啊。。。

直接對每一個長度為m的子串進行對比,設當前位置為i:

如果子串與p串中i位置字元相同 或 子串與p串中i與i+1兩個位置的字元組成相同,繼續往後掃;

一旦不滿足上述要求的情況發生,停止掃描,將這個子串在s串中的起點位置標記為0;

若整個子串都滿足第一條,將這個子串在s串中的起點位置標記為1;

程式碼:(跑了5000多ms,為了省事用的string,改成char[]和scanf什麼的會快很多)

#include<bits/stdc++.h>
using namespace std;
string s,p;
char ans[500005];
void check(int n,int m){
    int idx, flag;
    string tmp;
    for(int i = 0; i <= n-m; i++){
        tmp = s.substr(i,m);
        idx = 0, flag = 1;
        while(idx < m && flag){
            if(tmp[idx] == p[idx])
                idx++;
            else if(idx < m-1 && tmp[idx] == p[idx+1] && tmp[idx+1] == p[idx])
                idx += 2;
            else
                flag = 0;
        }
        ans[i] = ((idx>=m) && flag) ? '1' : '0';
    }
    ans[n] = '\0';
}
int main(){
    int t, n, m;
    cin >> t;
    while(t--){
        memset(ans,'0', sizeof(ans));
        cin >> n >> m;
        cin >> s >> p;
        check(n,m);
        cout << ans << endl;
    }
    return 0;
}