题目:
输入
abc
abcccabac
3
cbb
cbba
cba
样例
1
0
0
考察知识点:
思路:
参考:NewOJ Week 8题解_傅志凌的博客-CSDN博客
被 cin 卡了一下时间超限,关闭同步流就好了
代码:
'算法' ( times:1182ms )
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int ne[N][26];
string s, g;
#define IOF ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
int len()
{
int k = 0;
for (auto v : g)
k |= (1 << (v - 'a')); // 用 26位二进制统计字母种数,(之前用的set,感觉2进制更方便)
int len = 0, cnt = 0;
for (auto v : s)
{
cnt |= (1 << (v - 'a'));
if (cnt == k)
len++, cnt = 0;
}
return len;
}
bool check(string a)
{
int n = a.size();
a = " " + a;
int pos = 0;
for (int i = 1; i <= n; i++)
{
pos = ne[pos][a[i] - 'a'];
if (!pos) // pos等于0说明是无法匹配的
return false;
}
return true;
}
signed main()
{
IOF
int q;
cin >> g >> s >> q;
int m = len() + 1;
int n = s.size();
s = " " + s;
// 预处理 · ne[][] 数组,从前面跳到当前字母s[i]
for (int i = 1; i <= n; i++)
for (int j = i - 1; j >= 0; j--)
{
ne[j][s[i] - 'a'] = i;
// 直到找到上一个s[i]停止
if (s[j] == s[i])
break;
}
while (q--)
{
string a;
cin >> a;
int la = a.size();
if (la != m)
puts("0");
else if (check(a))
puts("0");
else
puts("1");
}
return 0;
}