KMP求助
  • 板块学术版
  • 楼主syr1125
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/14 12:00
  • 上次更新2024/7/14 14:24:37
查看原帖
KMP求助
561949
syr1125楼主2024/7/14 12:00

小 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;
}
2024/7/14 12:00
加载中...