小 Q 有一本神奇的字典,字典的神奇之处在于字典中有许多单词。
小 Q 想在字典中查找单词 s,但小 Q 太菜了以至于他不会查字典。
小 Q 现在只想知道字典中包含 s 的单词有哪些。
所以现在只能请你来帮帮忙啦。这本字典里的单词是乱序的,所以请你按字典序输出包含 s 的单词。
说人话就是给一个模式串然后给你 n 个串问你里面包不包含模式串。
code:TLE了
#include <bits/stdc++.h>
using namespace std;
int n, ans[1005], la, lb, j;
char a[1005], b[1005];
vector<string> v;
int main()
{
int n;
scanf("%d", &n);
cin >> b + 1;
lb = strlen(b + 1);
for (int k = 1; k <= n; k ++)
{
cin >> a + 1;
la = strlen(a + 1);
for (int i = 2; i <= lb; i ++)
{
while(j && b[i] != b[j + 1]) j = ans[j];
if(b[j + 1] == b[i]) j ++;
ans[i] = j;
}
j = 0;
for(int i = 1; i <= la; i ++)
{
while(j > 0 && b[j + 1] != a[i]) j = ans[j];
if (b[j + 1] == a[i]) j ++;
if (j == lb)
{
v.push_back(a + 1);
break;
j = ans[j];
}
}
for (int i = 0; i <= la; i ++) ans[i] = 0;
}
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); i ++)
{
cout << v[i] << "\n";
}
return 0;
}