青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

AC自動(dòng)機(jī)算法詳解

    首先簡(jiǎn)要介紹一下AC自動(dòng)機(jī):Aho-Corasick automation,該算法在1975年產(chǎn)生于貝爾實(shí)驗(yàn)室,是著名的多模匹配算法之一。一個(gè)常見的例子就是給出n個(gè)單詞,再給出一段包含m個(gè)字符的文章,讓你找出有多少個(gè)單詞在文章里出現(xiàn)過。要搞懂AC自動(dòng)機(jī),先得有模式樹(字典樹)TrieKMP模式匹配算法的基礎(chǔ)知識(shí)。AC自動(dòng)機(jī)算法分為3步:構(gòu)造一棵Trie樹,構(gòu)造失敗指針和模式匹配過程。
     如果你對(duì)KMP算法和了解的話,應(yīng)該知道KMP算法中的next函數(shù)(shift函數(shù)或者fail函數(shù))是干什么用的。KMP中我們用兩個(gè)指針ij分別表示,A[i-j+ 1..i]B[1..j]完全相等。也就是說,i是不斷增加的,隨著i的增加j相應(yīng)地變化,且j滿足以A[i]結(jié)尾的長(zhǎng)度為j的字符串正好匹配B串的前 j個(gè)字符,當(dāng)A[i+1]B[j+1]KMP的策略是調(diào)整j的位置(減小j值)使得A[i-j+1..i]B[1..j]保持匹配且新的B[j+1]恰好與A[i+1]匹配,而next函數(shù)恰恰記錄了這個(gè)j應(yīng)該調(diào)整到的位置。同樣AC自動(dòng)機(jī)的失敗指針具有同樣的功能,也就是說當(dāng)我們的模式串在Tire上進(jìn)行匹配時(shí),如果與當(dāng)前節(jié)點(diǎn)的關(guān)鍵字不能繼續(xù)匹配的時(shí)候,就應(yīng)該去當(dāng)前節(jié)點(diǎn)的失敗指針?biāo)赶虻墓?jié)點(diǎn)繼續(xù)進(jìn)行匹配。
      看下面這個(gè)例子:給定5個(gè)單詞:say she shr he her,然后給定一個(gè)字符串yasherhs問一共有多少單詞在這個(gè)字符串中出現(xiàn)過。我們先規(guī)定一下AC自動(dòng)機(jī)所需要的一些數(shù)據(jù)結(jié)構(gòu),方便接下去的編程。
 1 const int kind = 26
 2 struct node{  
 3     node *fail;       //失敗指針
 4     node *next[kind]; //Tire每個(gè)節(jié)點(diǎn)的個(gè)子節(jié)點(diǎn)(最多個(gè)字母)
 5     int count;        //是否為該單詞的最后一個(gè)節(jié)點(diǎn)
 6     node(){           //構(gòu)造函數(shù)初始化
 7         fail=NULL; 
 8         count=0
 9         memset(next,NULL,sizeof(next)); 
10     } 
11 }*q[500001];          //隊(duì)列,方便用于bfs構(gòu)造失敗指針
12 char keyword[51];     //輸入的單詞
13 char str[1000001];    //模式串
14 int head,tail;        //隊(duì)列的頭尾指針

有了這些數(shù)據(jù)結(jié)構(gòu)之后,就可以開始編程了:
   
首先,將這5個(gè)單詞構(gòu)造成一棵Tire,如圖-1所示。

 

 1 void insert(char *str,node *root){ 
 2     node *p=root; 
 3     int i=0,index;  
 4     while(str[i]){ 
 5         index=str[i]-'a'
 6         if(p->next[index]==NULL) p->next[index]=new node();  
 7         p=p->next[index];
 8         i++;
 9     } 
10     p->count++;     //在單詞的最后一個(gè)節(jié)點(diǎn)count+1,代表一個(gè)單詞
11 }

在構(gòu)造完這棵Tire之后,接下去的工作就是構(gòu)造下失敗指針。構(gòu)造失敗指針的過程概括起來就一句話:設(shè)這個(gè)節(jié)點(diǎn)上的字母為C,沿著他父親的失敗指針走,直到走到一個(gè)節(jié)點(diǎn),他的兒子中也有字母為C的節(jié)點(diǎn)。然后把當(dāng)前節(jié)點(diǎn)的失敗指針指向那個(gè)字母也為C的兒子。如果一直走到了root都沒找到,那就把失敗指針指向root。具體操作起來只需要:先把root加入隊(duì)列(root的失敗指針指向自己或者NULL),這以后我們每處理一個(gè)點(diǎn),就把它的所有兒子加入隊(duì)列,隊(duì)列為空。

 1 void build_ac_automation(node *root){
 2     int i;
 3     root->fail=NULL; 
 4     q[head++]=root; 
 5     while(head!=tail){ 
 6         node *temp=q[tail++]; 
 7         node *p=NULL; 
 8         for(i=0;i<26;i++){ 
 9             if(temp->next[i]!=NULL){ 
10                 if(temp==root) temp->next[i]->fail=root;                 
11                 else
12                     p=temp->fail; 
13                     while(p!=NULL){  
14                         if(p->next[i]!=NULL){ 
15                             temp->next[i]->fail=p->next[i]; 
16                             break
17                         } 
18                         p=p->fail; 
19                     } 
20                     if(p==NULL) temp->next[i]->fail=root; 
21                 } 
22                 q[head++]=temp->next[i];  
23             } 
24         }   
25     } 
26 }

    從代碼觀察下構(gòu)造失敗指針的流程:對(duì)照?qǐng)D-2來看,首先rootfail指針指向NULL,然后root入隊(duì),進(jìn)入循環(huán)。第1次循環(huán)的時(shí)候,我們需要處理2個(gè)節(jié)點(diǎn):root->next[‘h’-‘a’](節(jié)點(diǎn)h) root->next[‘s’-‘a’](節(jié)點(diǎn)s)。把這2個(gè)節(jié)點(diǎn)的失敗指針指向root,并且先后進(jìn)入隊(duì)列,失敗指針的指向?qū)?yīng)圖-2中的(1)(2)兩條虛線;第2次進(jìn)入循環(huán)后,從隊(duì)列中先彈出h,接下來p指向h節(jié)點(diǎn)的fail指針指向的節(jié)點(diǎn),也就是root;進(jìn)入第13行的循環(huán)后,p=p->fail也就是p=NULL,這時(shí)退出循環(huán),并把節(jié)點(diǎn)efail指針指向root,對(duì)應(yīng)圖-2中的(3),然后節(jié)點(diǎn)e進(jìn)入隊(duì)列;第3次循環(huán)時(shí),彈出的第一個(gè)節(jié)點(diǎn)a的操作與上一步操作的節(jié)點(diǎn)e相同,把afail指針指向root,對(duì)應(yīng)圖-2中的(4),并入隊(duì);第4次進(jìn)入循環(huán)時(shí),彈出節(jié)點(diǎn)h(圖中左邊那個(gè)),這時(shí)操作略有不同。在程序運(yùn)行到14行時(shí),由于p->next[i]!=NULL(rooth這個(gè)兒子節(jié)點(diǎn),圖中右邊那個(gè)),這樣便把左邊那個(gè)h節(jié)點(diǎn)的失敗指針指向右邊那個(gè)root的兒子節(jié)點(diǎn)h,對(duì)應(yīng)圖-2中的(5),然后h入隊(duì)。以此類推:在循環(huán)結(jié)束后,所有的失敗指針就是圖-2中的這種形式。

  最后,我們便可以在AC自動(dòng)機(jī)上查找模式串中出現(xiàn)過哪些單詞了。匹配過程分兩種情況:(1)當(dāng)前字符匹配,表示從當(dāng)前節(jié)點(diǎn)沿著樹邊有一條路徑可以到達(dá)目標(biāo)字符,此時(shí)只需沿該路徑走向下一個(gè)節(jié)點(diǎn)繼續(xù)匹配即可,目標(biāo)字符串指針移向下個(gè)字符繼續(xù)匹配;(2)當(dāng)前字符不匹配,則去當(dāng)前節(jié)點(diǎn)失敗指針?biāo)赶虻淖址^續(xù)匹配,匹配過程隨著指針指向root結(jié)束。重復(fù)這2個(gè)過程中的任意一個(gè),直到模式串走到結(jié)尾為止。
 1 int query(node *root){ 
 2     int i=0,cnt=0,index,len=strlen(str); 
 3     node *p=root;  
 4     while(str[i]){  
 5         index=str[i]-'a';  
 6         while(p->next[index]==NULL && p!=root) p=p->fail; 
 7         p=p->next[index]; 
 8         p=(p==NULL)?root:p; 
 9         node *temp=p; 
10         while(temp!=root && temp->count!=-1){ 
11             cnt+=temp->count; 
12             temp->count=-1
13             temp=temp->fail; 
14         } 
15         i++;                 
16     }    
17     return cnt; 
18 }
    對(duì)照?qǐng)D-2,看一下模式匹配這個(gè)詳細(xì)的流程,其中模式串為yasherhs。對(duì)于i=0,1。Trie中沒有對(duì)應(yīng)的路徑,故不做任何操作;i=2,3,4時(shí),指針p走到左下節(jié)點(diǎn)e。因?yàn)楣?jié)點(diǎn)e的count信息為1,所以cnt+1,并且講節(jié)點(diǎn)e的count值設(shè)置為-1,表示改單詞已經(jīng)出現(xiàn)過了,防止重復(fù)計(jì)數(shù),最后temp指向e節(jié)點(diǎn)的失敗指針?biāo)赶虻墓?jié)點(diǎn)繼續(xù)查找,以此類推,最后temp指向root,退出while循環(huán),這個(gè)過程中count增加了2。表示找到了2個(gè)單詞she和he。當(dāng)i=5時(shí),程序進(jìn)入第5行,p指向其失敗指針的節(jié)點(diǎn),也就是右邊那個(gè)e節(jié)點(diǎn),隨后在第6行指向r節(jié)點(diǎn),r節(jié)點(diǎn)的count值為1,從而count+1,循環(huán)直到temp指向root為止。最后i=6,7時(shí),找不到任何匹配,匹配過程結(jié)束。

    到此為止AC自動(dòng)機(jī)算法的詳細(xì)過程已經(jīng)全部介紹結(jié)束,看一道例題:http://acm.hdu.edu.cn/showproblem.php?pid=2222
Problem Description
In the modern time, Search engine came into the life of everybody like Google, Baidu, etc.
Wiskey also wants to bring this feature to his image retrieval system.
Every image have a long description, when users type some keywords to find the image, the system will match the keywords with description of image and show the image which the most keywords be matched.
To simplify the problem, giving you a description of image, and some keywords, you should tell me how many keywords will be match.
 

Input
First line will contain one integer means how many cases will follow by.
Each case will contain two integers N means the number of keywords and N keywords follow. (N <= 10000)
Each keyword will only contains characters 'a'-'z', and the length will be not longer than 50.
The last line is the description, and the length will be not longer than 1000000.
 

Output
Print how many keywords are contained in the description.
 

Sample Input
1
5
she
he
say
shr
her
yasherhs
 

Sample Output
3

 1 #include <iostream> 
 2 using namespace std; 
 3   
 4 const int kind = 26
 5 struct node{  
 6     node *fail;       //失敗指針
 7     node *next[kind]; //Tire每個(gè)節(jié)點(diǎn)的26個(gè)子節(jié)點(diǎn)(最多26個(gè)字母)
 8     int count;        //是否為該單詞的最后一個(gè)節(jié)點(diǎn)
 9     node(){           //構(gòu)造函數(shù)初始化
10         fail=NULL; 
11         count=0
12         memset(next,NULL,sizeof(next)); 
13     } 
14 }*q[500001];          //隊(duì)列,方便用于bfs構(gòu)造失敗指針
15 char keyword[51];     //輸入的單詞
16 char str[1000001];    //模式串
17 int head,tail;        //隊(duì)列的頭尾指針
18   
19 void insert(char *str,node *root){ 
20     node *p=root; 
21     int i=0,index;  
22     while(str[i]){ 
23         index=str[i]-'a'
24         if(p->next[index]==NULL) p->next[index]=new node();  
25         p=p->next[index];
26         i++;
27     } 
28     p->count++
29 
30 void build_ac_automation(node *root){
31     int i;
32     root->fail=NULL; 
33     q[head++]=root; 
34     while(head!=tail){ 
35         node *temp=q[tail++]; 
36         node *p=NULL; 
37         for(i=0;i<26;i++){ 
38             if(temp->next[i]!=NULL){ 
39                 if(temp==root) temp->next[i]->fail=root;                 
40                 else
41                     p=temp->fail; 
42                     while(p!=NULL){  
43                         if(p->next[i]!=NULL){ 
44                             temp->next[i]->fail=p->next[i]; 
45                             break
46                         } 
47                         p=p->fail; 
48                     } 
49                     if(p==NULL) temp->next[i]->fail=root; 
50                 } 
51                 q[head++]=temp->next[i];  
52             } 
53         }   
54     } 
55 
56 int query(node *root){ 
57     int i=0,cnt=0,index,len=strlen(str); 
58     node *p=root;  
59     while(str[i]){  
60         index=str[i]-'a';  
61         while(p->next[index]==NULL && p!=root) p=p->fail; 
62         p=p->next[index]; 
63         p=(p==NULL)?root:p; 
64         node *temp=p; 
65         while(temp!=root && temp->count!=-1){ 
66             cnt+=temp->count; 
67             temp->count=-1
68             temp=temp->fail; 
69         } 
70         i++;                 
71     }    
72     return cnt; 
73 
74 int main(){ 
75     int n,t; 
76     scanf("%d",&t); 
77     while(t--){  
78         head=tail=0
79         node *root=new node(); 
80         scanf("%d",&n); 
81         getchar(); 
82         while(n--){ 
83             gets(keyword); 
84             insert(keyword,root); 
85         } 
86         build_ac_automation(root); 
87         scanf("%s",str); 
88         printf("%d\n",query(root));  
89     } 
90     return 0
91 }

    PS:原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處

posted on 2009-04-21 18:22 極限定律 閱讀(68585) 評(píng)論(40)  編輯 收藏 引用 所屬分類: ACM/ICPC

評(píng)論

# re: AC自動(dòng)機(jī)算法詳解 2009-06-13 09:53 zab08

bfs寫成 頭入尾出...

  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2009-07-30 15:39 xtu715

您好,對(duì)于例題,請(qǐng)測(cè)試如下樣例:
1
2
tacab
aca
wqzpacakkk

您程序給出的答案是1.
可根據(jù)題意,正確答案應(yīng)該是2.

您代碼中65行,貌似有誤。

  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2009-07-30 15:49 xtu715

是我的錯(cuò),請(qǐng)無視。不好意思  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2009-08-25 14:00 zeus

沒想到又到你這里來 呵呵 看看先  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2009-08-26 15:47 路過

1
5
bhea
her
he
h
ha
bhera
輸出?  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解[未登錄] 2009-10-16 11:35 DD

65行的代碼temp->count!=-1這個(gè)條件不能要,否則就是錯(cuò)誤的。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2010-01-11 21:46 niubi

是主串在trie上匹配,不是模式串吧。。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解[未登錄] 2010-02-26 13:09 intheway

好東東,樓主辛苦了.  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2010-07-14 00:38 MJ_LC

@DD
如果temp->count!=-1說明該節(jié)點(diǎn)和之后的節(jié)點(diǎn)已經(jīng)計(jì)算過了  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2010-12-07 22:32 周燎明

@MJ_LC

請(qǐng)考慮第66與67 行,考慮將67行加一個(gè)執(zhí)行判斷條件:if count==1 再做賦值操作。。。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解[未登錄] 2010-12-22 20:03 AC

失敗指針構(gòu)造的描述好模糊。看了半天還是沒看懂。。繼續(xù)再看  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-03-10 21:44 dereky

膜拜了  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-04-08 11:19

你的代碼錯(cuò)了 失敗函數(shù)寫得有問題  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-05-28 19:45 anmtcel

您的程序會(huì)怎么處理模式串為
abcd和bc這兩個(gè),
主串為abcde的這個(gè)問題?
應(yīng)該是兩個(gè)串都出現(xiàn)了
但您的程序應(yīng)該只會(huì)找到第一個(gè)串,

因?yàn)閺腶一直順利的走向d,但d的失敗指針直接指向根了,
也就是不會(huì)走到bc那條小路里去。

我有個(gè)想法,就是需不需要預(yù)處理出哪些串是被當(dāng)前串包含的,
存當(dāng)前串所包含的串的位置,也就是當(dāng)當(dāng)前串被查找出來后,這些位置也標(biāo)記為已查找  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-06-19 20:15 fotile

我只想說,您的代碼實(shí)在不漂亮。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-06-19 20:23 fotile

講解很淺顯易懂,代碼里一串一串的!=NULL還要很多不必要的判斷實(shí)在是配不上文字的高超。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-07-03 13:46 酷行天下

大牛講的非常透徹,贊一個(gè)……  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-07-31 21:23 aa

膜拜  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-08-13 14:24 aaa

各種trie寫成tire  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-08-19 22:15 Evan

@路過
應(yīng)該是4 吧。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-10-21 11:04 mmx

好!  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2011-12-01 01:58 Miu_Y

節(jié)點(diǎn)申請(qǐng)了不釋放?  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2012-02-27 20:55 ITX351

57行為什么要求長(zhǎng)度= = 不理解  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2012-04-09 17:18 himdd

char str[1000001];應(yīng)該叫目標(biāo)串吧。。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2012-04-26 09:57 Lucian

內(nèi)容很棒,很容易理解!  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2012-05-16 11:25 wzq

多組數(shù)據(jù)的話,每組做完指針是不是應(yīng)該釋放呢?  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2012-07-15 23:12 re

代碼bug超多  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2012-09-13 12:06 cqwelly

頂一下  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2012-12-24 18:22 陳文康

@xtu715
為啥是2??  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2013-02-17 16:42 h

temp->count!=-1
注意:1、重復(fù)的只算一次;2、初始的count=0
模式串為
abcd和bc這兩個(gè),
主串為abcde的這個(gè)問題?
當(dāng)找到c時(shí),count[c]=0,tmp指針找到串bc的結(jié)尾c并統(tǒng)計(jì)。
  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2013-05-02 21:11 xero essential

其實(shí)程序上的錯(cuò)誤無傷大雅,個(gè)人感覺看了第一段就明白原理了,剩下的只是驗(yàn)證。。  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解[未登錄] 2013-08-10 21:47 111

好東西,謝了!  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2014-03-09 10:03 testcc

不會(huì)內(nèi)存泄露么??  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2014-03-25 10:28 Islo

orz  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2014-07-29 16:28 lb

先把root加入隊(duì)列(root的失敗指針指向自己或者NULL),這以后我們每處理一個(gè)點(diǎn),就把它的所有兒子加入隊(duì)列,隊(duì)列為空。
這句話什么意思  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2014-09-12 12:55 Vmurder

@xtu715
為什么是2?  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2015-05-10 11:23

http://sunmoon-template.blogspot.tw/2015/05/aho-corasick-automation-ac.html
構(gòu)造的地方可以更簡(jiǎn)潔  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2015-07-26 19:13 @anyi

真好  回復(fù)  更多評(píng)論   

# re: AC自動(dòng)機(jī)算法詳解 2015-08-20 11:30 fastmatch

@anmtcel
abcd和bc不在一個(gè)分支上  回復(fù)  更多評(píng)論   

<2015年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(10)

隨筆分類

隨筆檔案

友情鏈接

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩成人在线视频| 国产精品视频999| 噜噜噜噜噜久久久久久91| 久久精品一区蜜桃臀影院| 久久精品视频导航| 久久全球大尺度高清视频| 久久久久网址| 欧美成人综合| 欧美日韩在线观看视频| 国产精品久久久久国产精品日日| 国产精品免费视频xxxx| 国产日韩精品一区二区三区在线| 韩国成人福利片在线播放| 在线观看91精品国产麻豆| 亚洲国产精品悠悠久久琪琪| 亚洲人屁股眼子交8| 亚洲视频久久| 久久激情久久| 欧美电影美腿模特1979在线看| 亚洲黄色成人久久久| 亚洲毛片在线观看.| 亚洲欧美日韩精品一区二区| 久久久精品午夜少妇| 嫩草国产精品入口| 欧美特黄一级大片| 国产亚洲一区二区三区在线观看 | 日韩亚洲欧美精品| 亚洲字幕在线观看| 久久精品人人做人人爽电影蜜月| 欧美sm视频| 国产精品www| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲精品国产无天堂网2021| 亚洲自拍另类| 欧美69视频| 在线亚洲电影| 久久综合精品国产一区二区三区| 欧美日韩大陆在线| 国产亚洲激情| 中文日韩电影网站| 久久综合给合| 亚洲美洲欧洲综合国产一区| 午夜影院日韩| 欧美日韩成人一区二区| 国产亚洲精品久久久久久| 亚洲毛片网站| 久久婷婷蜜乳一本欲蜜臀| 亚洲精品乱码久久久久久蜜桃91| 午夜日韩电影| 欧美日韩卡一卡二| 伊人成人开心激情综合网| 亚洲一区精彩视频| 亚洲成色777777女色窝| 香蕉亚洲视频| 欧美日韩一区国产| 亚洲电影免费在线 | 欧美日韩大片| 永久555www成人免费| 亚洲欧美精品一区| 91久久国产自产拍夜夜嗨| 久久精品72免费观看| 欧美日韩在线视频一区二区| 亚洲大片在线| 久久久91精品国产| 亚洲一级网站| 欧美日韩1080p| **网站欧美大片在线观看| 羞羞答答国产精品www一本 | 欧美高清在线| 韩国成人福利片在线播放| 亚洲制服av| 亚洲精品永久免费| 久久久久久一区二区| 国产片一区二区| 亚洲欧美精品| 日韩视频一区二区三区在线播放| 狂野欧美一区| 有码中文亚洲精品| 欧美中文字幕| 亚洲欧美视频在线观看视频| 欧美视频中文字幕在线| 99re66热这里只有精品4| 欧美91福利在线观看| 久久激情视频免费观看| 国产午夜精品久久久| 午夜精品www| 亚洲小视频在线| 欧美日韩亚洲一区二| 亚洲美女在线国产| 亚洲人成网站色ww在线| 嫩草成人www欧美| 亚洲激情综合| 亚洲第一视频网站| 美国十次成人| 亚洲精品一级| 亚洲激情成人在线| 欧美精品国产| 夜夜嗨av一区二区三区四季av| 亚洲激情影院| 欧美麻豆久久久久久中文| 一区二区av| 99精品视频免费观看视频| 欧美日韩色婷婷| 亚洲综合不卡| 亚洲欧美日韩精品综合在线观看 | 亚洲精品一区二区三区樱花| 欧美好吊妞视频| 宅男噜噜噜66国产日韩在线观看| 亚洲美女福利视频网站| 欧美日韩免费精品| 亚洲免费影视| 欧美一区二区免费观在线| 国模套图日韩精品一区二区| 久久字幕精品一区| 欧美不卡在线视频| 宅男精品导航| 亚洲欧美三级在线| 在线观看免费视频综合| 欧美激情在线免费观看| 欧美人在线视频| 午夜精品福利一区二区蜜股av| 性感少妇一区| 亚洲国产一区二区a毛片| 亚洲人体大胆视频| 国产精品一卡二卡| 麻豆精品在线播放| 欧美精品在线观看播放| 亚洲一区日韩在线| 久久国产精品一区二区三区| 亚洲日本成人| 亚洲婷婷在线| 曰韩精品一区二区| 日韩午夜黄色| 国产一区二区三区成人欧美日韩在线观看 | 一本大道av伊人久久综合| 国产精品一区二区在线观看| 久久视频在线看| 欧美日产在线观看| 久久九九热re6这里有精品| 免费观看亚洲视频大全| 亚洲与欧洲av电影| 久久香蕉精品| 亚洲综合视频一区| 久久久久一本一区二区青青蜜月| 99成人在线| 午夜精品久久久| 亚洲裸体视频| 欧美在线一二三四区| 亚洲精选在线| 久久国产精品久久久久久电车| 日韩视频欧美视频| 久久福利资源站| 亚洲婷婷综合色高清在线| 久久精品国产清自在天天线 | 欧美福利网址| 久久精品99无色码中文字幕| 免费欧美日韩| 久久精品视频免费观看| 欧美人在线视频| 牛牛精品成人免费视频| 国产精品亚洲综合天堂夜夜| 亚洲国产成人久久| 国模精品娜娜一二三区| 一区二区高清在线观看| 亚洲黄色一区二区三区| 午夜精品久久久久久久99热浪潮 | 久久亚洲综合色| 国产精品v欧美精品∨日韩| 欧美成人精品在线| 国产日韩欧美一区二区三区四区| 亚洲精品国精品久久99热| 狠狠噜噜久久| 亚洲欧美中文日韩在线| 亚洲性线免费观看视频成熟| 欧美91福利在线观看| 久久一区二区视频| 国产日韩精品综合网站| 日韩亚洲精品在线| 亚洲精品一区二| 久久综合狠狠| 久热re这里精品视频在线6| 国产农村妇女精品| 亚洲无线视频| 亚洲一区二区3| 欧美日本精品| 亚洲国产美女| 亚洲精品你懂的| 美日韩精品视频| 欧美成人精品一区| 在线日本成人| 久久免费视频观看| 久久综合一区二区| 国内精品视频在线观看| 校园春色综合网| 久久精品国产清自在天天线| 国产老女人精品毛片久久| 亚洲一级在线| 欧美影院精品一区| 国产酒店精品激情| 亚洲一区二区综合|