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
Author
zimpha
Source
暴力水过
#include<iostream> #include<cstring> #include<cstdio> using namespace std; char a[100005],b[5005]; int ans[100005],vis[5005]; int main() { int t,n,m; scanf("%d",&t); while(t--) { memset(ans,0,sizeof ans); memset(vis,0,sizeof vis); scanf("%d%d",&n,&m); scanf("%s%s",a,b); for(int i=0;i<n;) { int per=i+1; for(int j=0;j<m;) { if(a[i]==b[j]) { i++,j++; } else if(a[i]==b[j+1]&&a[i+1]==b[j]&&j<m&&i<n) { i+=2; j+=2; } else if(a[i]!=b[j]) { i=per; break; } if(j==m) { i=per; ans[per-1]=1; } } } for(int i=0;i<n;i++) { printf("%d",ans[i]); } printf("\n"); } }