La Vie en rose
Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 744 Accepted Submission(s): 386
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
Recommend
题意:p对s每一段子字符串进行匹配,如果p可以通过相邻两个交换得到s的子串,那么该s子串的首位就改为1,否则为0,注意相邻两个位置只能交换一次,例如第一位和第二位交换了,那么第二位不可以和第三位交换。其实题目意思我也不太懂,但是最后化简问题就是这样。下面给代码。
#include<iostream> #include<stack> #include<cstring> #include<map> #include<string> #include<queue> #include<algorithm> #include<cstdio> #include<utility> using namespace std; #define maxn 100005 char s[maxn], p[5005]; int main() { int t; scanf("%d", &t); while (t--) { int slength, plength; scanf("%d%d", &slength, &plength); scanf("%s%s", s, p); for (int i = 0; i < slength; i++) {//从第一位开始匹配 char x = '1';//x为第i个位置最后输出的数字 for (int j = 0; j < plength;) { if (s[i+j] == p[j]) { j++;//如果这一位一样的话看下一位 } else if (s[i + j] == p[j + 1] && s[i + j + 1] == p[j]) { j += 2;//如果相邻两位一样的话就跳到第三位 } else { x = '0';//如果以上两种情况都不是,那么他不能匹配 break; } } s[i] = x; } printf("%s\n", s); } }