题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5745
La Vie en rose
Time Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 949 Accepted Submission(s): 516
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
解题思路:
我们采用pre的方法进行标记前一状态。分为以下三种:
1、pre=0;表示和当前位置正好匹配成功
2、pre=1;表示和后一位匹配成功
3、pre=-1;表示和前一位匹配成功
根据pre的状态就可以知道是否两个字符串可以匹配成功。
因为第一位只可能是和当前位匹配或者和后一位匹配,最后一位就只能是当前位和前一位是否匹配。
而加在两位中间的就是以上三种情况。
通过这样一位一位的查找,如果能够成功,循环就会结束、j>=m,就输出1,否则,输出0;
详见代码。
#include <iostream>
#include <cstdio>
using namespace std;
char ch1[100010],ch2[5010];
int main()
{
int t,pre;
scanf("%d",&t);
while (t--)
{
int n,m;
scanf("%d%d",&n,&m);
scanf("%s%s",ch1,ch2);
for (int i=0; i<n; i++)//ch1的起点
{
if (ch1[i]==ch2[0])
pre=0;
else if (ch1[i]==ch2[1])
pre=1;
else
{
//cout<<1<<endl;
printf ("0");
continue;
}
int k=i+1,j;
for (j=1; j<m; j++,k++)//ch2
{
if (pre==0||pre==-1)
{
if (ch1[k]==ch2[j])
{
pre=0;
}
else if (j<m-1&&ch1[k]==ch2[j+1])
{
pre=1;
}
else
break;
}
else if (pre==1)
{
if (ch1[k]==ch2[j-1])
pre=-1;
else
break;
}
}
if (j>=m)
printf ("1");
else
printf ("0");
}
printf("\n");
}
return 0;
}
|
ij
−
ij+1
|
>
1
|
ij
−
ij+1
|
>
1