1. 程式人生 > >HDU 2846(Tire的變形)

HDU 2846(Tire的變形)

題意:給你p個字串,q次詢問,問p個字串中含有q的字串的個數。

思路:看了別人的題解,講p個字串的字尾也存入字典樹,但是這樣會有abab這種字串出現重複計數的情況,用vis作為標記,鶸表達能力有限,詳細看程式碼。

#include <iostream>
#include <stdio.h>
#include <string.h>
#define maxn 500010
using namespace std;
int cnt=1;
struct Tire{
    int pointer[26];
    int value;
    int vis;
    Tire()
    {
        memset(pointer,0
,sizeof(pointer)); value=0; vis=0; } }pile[maxn]; void Build(char *s,int ID)///建樹 { int var=0,len=strlen(s); for(int i=0;i<len;i++) { int id=s[i]-'a'; if(pile[var].pointer[id]==0) { var=pile[var].pointer[id]=cnt++; pile[var].value
++; pile[var].vis=ID; } else { var=pile[var].pointer[id]; if(pile[var].vis!=ID)///vis不等於當前的ID,說明不是字串。 { pile[var].value++; pile[var].vis=ID; } } } } int Search(char *s)///搜尋 { int
var=0; int len=strlen(s); for(int i=0;i<len;i++) { if(pile[var].pointer[s[i]-'a']==0) { return 0; } var=pile[var].pointer[s[i]-'a']; } return pile[var].value; } int main() { int p; cin>>p; char s[55]; while(p--) { scanf("%s",s); for(int i=0;i<strlen(s);i++) Build(s+i,p);///將該字元的編號做為標記 } int q; cin>>q; while(q--) { scanf("%s",s); cout<<Search(s)<<endl; } }