做下kmp,和字典树,回忆一下自己从前做过的知识~~~
貌似~~~忘记的差不~~多了~~码了两道题~~写一下~~
http://acm.hdu.edu.cn/showproblem.php?pid=1711
hdu 1711 上面的题~~~
post code 直接贴代码~~~
#include<stdio.h> int len1,len2,nextval[11000],pos; int a[1000010],b[11000]; void getnext(); int main() { int i,j,n; scanf("%d",&n); while(n--) { scanf("%d",&len1); scanf("%d",&len2); for(i=0;i<len1;i++) scanf("%d",&a[i]); for(i=0;i<len2;i++) scanf("%d",&b[i]); getnext(); i=0;j=0; while(i<len1&&j<len2) { if(j==-1||a[i]==b[j]){i++;j++;} else j=nextval[j]; } if(j>=len2)pos=i-len2+1; else pos=-1; printf("%d\n",pos); } } void getnext() { int j,k; j=0; k=-1; nextval[0]=-1; while(j<len2) { if(k==-1||b[j]==b[k]) { j++;k++; if(b[j]!=b[k])nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; } }
字典树的知识:http://acm.hdu.edu.cn/showproblem.php?pid=1251
#include<stdio.h> #include<string.h> #include<stdlib.h> struct node{ struct node *next[26]; int count ; } *p; char a[20]; void maketire(); void searchtire(); int main() { int i; p=(struct node *)malloc(sizeof(struct node)); for(i=0;i<26;i++) p->next[i]=NULL; while(gets(a)&&a[0]!='\0') maketire(); while(gets(a)) searchtire(); } void maketire() { int len,i,j; struct node *q,*temp; len=strlen(a); q=p; for(i=0;i<len;i++) { if(q->next[a[i]-'a']==NULL) { temp=(struct node*)malloc(sizeof(struct node)); for(j=0;j<26;j++) temp->next[j]=NULL; temp->count=0; q->next[a[i]-'a']=temp; } q=q->next[a[i]-'a']; q->count++; } } void searchtire() { int len,i,flag=0; struct node *t=p; len=strlen(a); for(i=0;i<len;i++) { if(t->next[a[i]-'a']!=NULL) { t=t->next[a[i]-'a']; } else {printf("0\n");flag=1;break;} } if(flag==0) printf("%d\n",t->count); }
下面就是ac自动机问题: