题目链接:HDU5745
La Vie en roseTime Limit: 14000/7000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 871 Accepted Submission(s): 467
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 .
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.
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
Sample Output
Author
zimpha
Source
Recommend
|
题目分析:按照答案的正解是dp加位操作,这个我过一阵再写,网上大多数做法是暴力搞,复杂度O(mn),4500ms勉强过。仔细想下10w*5k*T竟然不到5s就跑过了,数据也是够弱的。
//
// main.cpp
// La Vie en rose
//
// Created by teddywang on 2016/7/21.
// Copyright © 2016年 teddywang. All rights reserved.
//
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAX 500010
#define MIN 11000
int T,ls,lp;
int poss,posp;
int ans[100010];
char s[100010],p[5005];
int main()
{
cin>>T;
while(T--)
{
memset(ans,0,sizeof(ans));
scanf("%d%d",&ls,&lp);
scanf("%s",s);
scanf("%s",p);
poss=posp=0;
while(poss<ls&&posp<lp)
{
if(s[poss]==p[posp])
{
if(posp==lp-1)
{
ans[poss-posp]=1;
poss=poss-posp+1;
posp=0;
}
else
{
poss++;
posp++;
}
}
else if(s[poss]==p[posp+1]&&s[poss+1]==p[posp])
{
if(posp==lp-2)
{
ans[poss-posp]=1;
poss=poss-posp+1;
posp=0;
}
else
{
poss+=2;
posp+=2;
}
}
else
{
poss=poss-posp+1;
posp=0;
}
}
for(int i=0;i<ls;i++)
printf("%d",ans[i]);
printf("\n");
}
}