La Vie en rose
Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 643 Accepted Submission(s): 328
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
题意:输入两个字符串s串和p串,p串从s串的第一个字符开始一直比较到最后一个(如果后面字符比p串段,则肯定输出0),比较的时候若不相同,则p串的字符可以相邻交换进行比较,每个位置只能交换一次,(只是当前比较的交换,而不是永久交换),相同字符串输出1,不同则输出0。
纯暴力,从第一个字符开始比较就好。
附上代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <cstring> 5 #define ll long long 6 using namespace std; 7 char s1[110005],s2[5005]; 8 int main() 9 { 10 int T,i,j; 11 scanf("%d",&T); 12 while(T--) 13 { 14 int len1,len2; 15 memset(s1,'\0',sizeof(s1)); 16 memset(s2,'\0',sizeof(s2)); 17 scanf("%d%d",&len1,&len2); 18 scanf("%s%s",s1,s2); 19 char w; 20 if(len1<len2) 21 { 22 for(i=0; i<len1; i++) 23 printf("0"); 24 printf("\n"); 25 continue; 26 } 27 for(i=0; i<len1; i++) 28 { 29 int t=0; 30 for(j=i; j<i+len2&&j<len1; j++) 31 { 32 if(s1[j]!=s2[t]) 33 { 34 if(j==i+len2-1) 35 break; 36 if(s1[j+1]!=s2[t]||s1[j]!=s2[t+1]) 37 break; 38 else 39 { 40 t+=2; 41 j+=1; 42 } 43 } 44 else 45 { 46 t++; 47 } 48 } 49 if(j==i+len2) 50 printf("1"); 51 else 52 printf("0"); 53 54 } 55 printf("\n"); 56 } 57 return 0; 58 }