BZOJ 2083 [Poi2010]Intelligence test

来源:互联网 发布:wampserver sql密码 编辑:程序博客网 时间:2024/05/16 11:57

链表

子序列匹配,以为是什么高级的数据结构之类的,然而并不是。。。

如果只有一个串,我们一定是贪心地遍历a,如果b的第一个数字是a[i],那么我们就直接把b的第一个元素去掉,继续匹配。

那么多个匹配也是一样的,对于每一个a[i],我们只需要把所有开头是a[i]的b全部去掉头元素即可。可以链表维护。

#include<cstdio>#include<vector>#define N 1000005using namespace std;int a[N], b[N];struct seq{    vector<int> arr;    seq *next;    int id;}*head[N];bool flag[N];int in(){    register int r = 0;    register char c = getchar();    while(c<'0'||c>'9')c=getchar();    while(c>='0'&&c<='9')r=r*10+c-'0',c=getchar();    return r;}int main(){    int n, m;    n=in();    for(int i = 1; i <= n; i++)        a[i]=in();    m=in();    for(int i = 1; i <= m; i++)    {        int len=in();;        seq *temp = new seq;        for(int j = 1; j <= len; j++)            b[j]=in();        for(int j = len; j; j--)            temp->arr.push_back(b[j]);        temp->next=head[temp->arr.back()];        temp->id=i;        head[temp->arr.back()]=temp;    }    for(int i = 1; i <= n; i++)    {        seq *next, *pos = head[a[i]];        head[a[i]]=NULL;        for(; pos; pos=next)        {            next = pos->next;            pos->arr.pop_back();            if(pos->arr.empty())            {                flag[pos->id]=1;                continue;            }            pos->next=head[pos->arr.back()];            head[pos->arr.back()]=pos;        }    }    for(int i = 1; i <= m; i++)        puts(flag[i]?"TAK":"NIE"); }
0 0
原创粉丝点击