锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include <string.h>
#include <math.h>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
#define KIND 128
#define M 10010
struct node
{
node *fail;
node *next[KIND];
int id;
node ()
{
fail = NULL;
id = 0;
memset(next, 0, sizeof(next));
}
};
char ch[M];
queue<node *> q;
vector<int> g;
void insert(node *&root, char *ch, int id)
{
node *p = root;
int i = 0, t;
while(ch[i])
{
t = ch[i] - 31;
if(!p->next[t]) p->next[t] = new node();
p = p->next[t];
i++;
}
p->id = id;
}
void AC(node *&root)
{
q.push(root);
while(!q.empty())
{
node *p = NULL;
node *t = q.front();
q.pop();
for(int i = 0; i < KIND; i++)
{
if(t->next[i])
{
p = t->fail;
while(p)
{
if(p->next[i])
{
t->next[i]->fail = p->next[i];
break;
}
p = p->fail;
}
if(!p) t->next[i]->fail = root;
q.push(t->next[i]);
}
}
}
}
bool query(node *&root, char *ch, int count)
{
g.clear();
int i = 0, t, top = 0, flag = 0;
node *p = root, *tmp;
while(ch[i])
{
t = ch[i] - 31;
while(!p->next[t] && p != root) p = p->fail;
p = p->next[t];
if(!p) p = root;
tmp = p;
while(tmp != root && tmp->id)
{
flag = 1;
g.push_back(tmp->id);
tmp = tmp->fail;
}
i++;
}
if(!flag) return false;
sort(g.begin(), g.end());
printf("web %d:", count);
printf(" %d", g[0]);
for(int i = 1; i < g.size(); i++)
{
if(g[i] != g[i - 1])
printf(" %d", g[i]);
}
printf("\n");
return true;
}
int main()
{
int n, total;
while(~scanf("%d", &n))
{
node *root = new node();
total = 0;
for(int i = 0; i < n; i++)
{
scanf("%s", ch);
insert(root, ch, i + 1);
}
AC(root);
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%s", ch);
if(query(root, ch, i + 1)) total++;
}
printf("total: %d\n", total);
}
return 0;
}
]]>
#include <stdlib.h>
#include <string.h>
#define N 500005
#define KIND 26
struct node
{
node *fail;
node *next[KIND];
int count;
node()
{
fail = NULL;
count = 0;
memset(next, 0, sizeof(next));
}
}*queue[N];
void insert(node *root, char *str)
{
int i = 0, index;
node *p = root;
while(str[i])
{
index = str[i] - 'a';
if(p->next[index] == NULL) p->next[index] = new node();
p = p->next[index];
i++;
}
p->count++;
}
void build(node *root)
{
int front = 0, rear = 0;
root->fail = NULL;
queue[rear++] = root;
while(front < rear)
{
node *tmp = queue[front++];
node *p = NULL;
for(int i = 0; i < KIND; i++)
{
if(tmp->next[i])
{
p = tmp->fail;
while(p)
{
if(p->next[i])
{
tmp->next[i]->fail = p->next[i];
break;
}
p = p->fail;
}
if(!p) tmp->next[i]->fail = root;
queue[rear++] = tmp->next[i];
}
}
}
}
char str[1000005];
int query(node *root)
{
int i = 0, ans = 0, index;
node *p = root, *tmp;
while(str[i])
{
index = str[i] - 'a';
while(p->next[index] == NULL && p != root) p = p->fail;
p = p->next[index];
if(!p) p = root;
tmp = p;
while(tmp != root)
{
ans += tmp->count;
tmp->count = 0;
tmp = tmp->fail;
}
i++;
}
return ans;
}
int main()
{
int t, nkey, ans;
char key[100];
scanf("%d", &t);
while(t--)
{
node *root = new node();
scanf("%d", &nkey);
for(int i = 0; i < nkey; i++)
{
scanf("%s", key);
insert(root, key);
}
build(root);
scanf("%s", str);
ans = query(root);
printf("%d\n", ans);
}
return 0;
}
]]>
#include <string>
#include <map>
using namespace std;
char word[27] = "abcdefghijklmnopqrstuvwxyz";
bool mk[27];
map<string, int> hash;
int num;
void build(int pos, int deep)
{
if(!deep)
{
num++;
char tmp[6];
int len = 0;
for(int i = 0; i < 26; i++)
{
if(mk[i]) tmp[len++] = word[i];
}
tmp[len] = 0;
// printf("%s\n", tmp);
// system("pause");
hash[(string)tmp] = num;
return;
}
if(pos >= 26) return;
mk[pos] = 1;
build(pos + 1, deep - 1);
mk[pos] = 0;
build(pos + 1, deep);
}
int main()
{
num = 0;
for(int i = 1; i < 6; i++) build(0, i);
char data[6];
while(gets(data)) printf("%d\n", hash[data]);
return 0;
}
]]>
#include <stdlib.h>
#include <string.h>
#define N 50005
#define KIND 26
struct TreeNode
{
int count;
TreeNode *next[KIND];
TreeNode()
{
count = 0;
memset(next, 0, sizeof(next));
}
}*root;
char data[N][105], data1[105], data2[105];
void Insert(char *s)
{
TreeNode *r = root;
for(; *s; s++)
{
int t = (*s) - 'a';
if(NULL == r->next[t])
{
r->next[t] = new TreeNode();
}
r = r->next[t];
}
r->count = 1;
}
bool Find(char *s)
{
int count = 0;
TreeNode *r = root;
for(; *s; s++)
{
int t = (*s) - 'a';
if(r->next[t] == NULL) return false;
r = r->next[t];
}
if(r->count) return true;
return false;
}
void Release(TreeNode *p)
{
for(int i = 0; i < KIND; i++)
{
if(p->next[i]) Release(p);
}
delete p;
}
int main()
{
int n = 0;
root = new TreeNode();
while(scanf("%s", data[n]) != EOF)
{
Insert(data[n]);
n++;
}
for(int i = 0; i < n; i++)
{
int l = strlen(data[i]);
for(int j = 1; j < l; j++)
{
int k;
for(k = 0; k < j; k++)
data1[k] = data[i][k];
data1[k] = '\0';
for(k = j; k < l; k++)
data2[k - j] = data[i][k];
data2[k - j] = '\0';
// strncpy(data1, data[i], j);
// strncpy(data2, data[i] + j, l - j + 1);
// puts(data1);puts(data2);
if(Find(data1) && Find(data2))
{
puts(data[i]);
break;
}
}
}
//Release(root);
return 0;
}
]]>
#include <string.h>
#define N 10005
#define KIND 10
struct TreeNode
{
TreeNode *next[KIND];
}table[N * 10], root;
char data[N][15];
int sp;
void Insert(char *data)
{
TreeNode *r = &root;
for(; *data; data++)
{
int t = *data - '0';
if(NULL == r->next[t])
{
r->next[t] = &table[sp];
memset(table[sp].next, 0, sizeof(table[sp].next));
sp++;
}
r = r->next[t];
}
}
bool Find(char *data)
{
TreeNode *r = &root;
for(; *data; data++)
{
int t = *data - '0';
r = r->next[t];
}
for(int i = 0; i < KIND; i++)
if(r->next[i]) return 1;
return 0;
}
int main()
{
int n, t;
bool flag;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
memset(root.next, 0, sizeof(root.next));
sp = 0;
for(int i = 0; i < n; i++)
{
scanf("%s", &data[i]);
Insert(data[i]);
}
flag = 1;
for(int i = 0; i < n; i++)
{
if(Find(data[i]))
{
flag = 0;
break;
}
}
if(!flag) puts("NO");
else puts("YES");
}
return 0;
}
]]>