思路:题目好像有错,应该是每个位置只能和相邻的交换一次,每个位置只能交换一次,然后直接O(nm)暴力...
#include<bits/stdc++.h>
using namespace std;
char s[100005],p[5005];
int ans[100005];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int lens,lenp;
scanf("%d%d",&lens,&lenp);
scanf("%s",s);
scanf("%s",p);
memset(ans,0,sizeof(ans));
int poss = 0,posp = 0;
while(poss<lens && posp<lenp)
{
if(s[poss]==p[posp])
{
if(posp == lenp-1)
{
ans[poss+1-lenp]=1;
poss = poss+1-lenp+1;
posp = 0;
continue;
}
else
{
poss++;
posp++;
}
}
else if(s[poss]==p[posp+1] && s[poss+1]==p[posp])
{
if(posp+1 == lenp-1)
{
ans[poss+2-lenp]=1;
poss = poss+2-lenp+1;
posp = 0;
continue;
}
else
{
poss+=2;
posp+=2;
}
}
else
{
poss-=posp;
posp = 0;
poss++;
}
}
for(int i = 0;i<lens;i++)
printf("%d",ans[i]);
printf("\n");
}
}
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