Я не знаю, какой метод используется SO, но:
Полагаю, быстрый (и очень упрощенный) способ сделать это - вернуться к C и проверить их один за другим,может быть, с алгоритмом KMP .
Другой (не такой простой) способ сделать это - сохранить trie с этими 10.000 слов и искать текст с использованием этого,Это было бы очень быстро, но довольно сложно реализовать.Если вам интересно, у меня есть фиктивная реализация на C ++.
EDIT
Оглядываясь назад, я вижу, что я использовал только fstream, так что это может бытьлегко модифицируется для C, так что вы сможете легко интегрироваться с python .Это источник:
#include <fstream>
using namespace std;
ifstream in("trie.in");
ofstream out("trie.out");
struct Trie
{
short nr, pref;
Trie *children[26], *father;
Trie()
{
int i;
nr = pref = 0;
for(i=0; i<26; i++)
children[i] = NULL;
father = NULL;
}
};
Trie t, *it, *it2;
int n, op, val, i, l, len;
char s[22],*p;
int main()
{
while(in>>op>>s)
{
p = s;
it = &t;
l = 0;len=0;
while(p[0] != '\0')
{
if(it->children[p[0] - 'a'] == NULL && op == 2)
{op=9; out<<"0\n"; break;}
if(it->children[p[0] - 'a'] == NULL && op == 3)
break;
if(it->children[p[0] - 'a'] == NULL)
it->children[p[0] - 'a'] = new Trie(), it->children[p[0] - 'a']->father = it,
it = it->children[p[0] - 'a'];
else
it = it->children[p[0] - 'a'];
if(op == 0)
++ it->pref;
else if(op == 1 && it->pref > 0)
-- it->pref;
else if(op == 3 && it->pref > 0)
l = p-s+1;
p++;
}
if(op == 0)
it->nr ++;
else if(op == 1 && it->nr > 0)
{
it->nr --;
l = strlen(s)-1;
while(it->pref == 0 && it != &t && l>=0)
{
it2 = it->father;
it2->children[s[l--] - 'a'] = NULL;
delete it;
it = it2;
}
}
else if(op == 2)
out<<it->nr<<'\n';
else if(op == 3)
out<<l<<'\n';
}
return 0;
}
Он принимает trie.in
текст, отформатированный так:
0 lat
0 mare
0 lac
2 la
0 mare
1 lat
0 ma
0 lung
3 latitudine
0 mari
2 mare
0 lat
0 mic
3 latime
2 lac
3 mire
И производит текст, подобный этому
0
2
2
3
1
2
0 w- добавить слово w в список (может быть несколько раз)
1 w - удалить одну запись слова w из списка (может быть несколько раз)
2 w - напечатать какв списке много слов w
3 w - выведите длину самого длинного общего префикса w с любым другим словом в списке
О, и извините за плохое форматирование, этобыло сделано для обучения.