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 .
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.
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.
Output
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
题意:给一个原串给一个匹配串,匹配串可以任选一些不相邻的字符,把这些字符和相邻的字符交换,匹配成功串首为1,else0;
解:标程用的bitset,不晓得是什么阿..暴力如下:
<pre name="code" class="cpp">
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
char ans[100000 + 5];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
string a, b;
cin>>a>>b;
memset(ans, '1', sizeof ans);
for(int i = 0; i <= n-m; i++)
{
for(int j = 0; j < m; j++)
{
if(a[i+j] == b[j])
;
else if(j < m-1 && a[i+j] == b[j+1] && a[i+j+1] == b[j]) // 交换匹配,先控制范围
j++;
else
{
ans[i] = '0';
break;
}
}
}
for(int i = 0; i < n-m+1; i++)
cout<<ans[i];
while(--m)
cout<<'0'; //倒数几个长度不够的一定匹配不到。
cout<<endl;
}
return 0;
}