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

算法學社
記錄難忘的征途
posts - 141,comments - 220,trackbacks - 0
由于這周初學SAM,變找些題在做。有了SAM,很多問題都變簡單了,比如這題。。。
題目描述:
   詢問兩個長度為100,000的字符串,不小于k的公共子串有多少個。
算法分析:
   對一個串建立SAM,并預處理出某個節點可以匹配的串的終點位置的個數,另一個串在上面跑。
   跑的同時記錄最大可匹配范圍len。
   如果匹配到某個點,len的值大于k了。那么就說明該統計能匹配的串然后加入到answer中了。

   這個統計應該是不斷回溯這個節點的父親。而且對于某個k,除了第一個點,其他的點答案都是一樣,于是可以記憶化。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 using namespace std;
 6 const int N = (int)1e5+10;
 7 char ch[N],pat[N];
 8 int par[N<<1], G[N<<1][60], val[N<<1], sz, last;
 9 inline int convert(char x){if(x >= 'a' && x <= 'z'return x - 'a'else return x - 'A' + 26;}
10 void ins(int x){
11     int p = last , np = sz ++;
12     memset(G[np],0,sizeof(G[np]));
13     val[np] = val[p] + 1;
14     while(p!=-1&&G[p][x]==0)G[p][x]=np,p=par[p];
15     if(p==-1){
16         par[np]=0;
17     } else {
18         int q=G[p][x];
19         if(val[q]==val[p]+1) par[np]=q;
20         else {
21             int nq = sz ++;
22             val[nq] = val[p]+1;
23             memcpy(G[nq],G[q],sizeof(G[q]));
24             par[nq] = par[q];
25             par[q] = par[np] = nq;
26             while(p!=-1 && G[p][x]==q) G[p][x]=nq, p=par[p];
27         }
28     }
29     last = np;
30 }
31 int cnt[N<<1];
32 struct node{
33     int id,v;
34     node(){};
35     node(int _id,int _v):id(_id),v(_v){}
36     bool operator < (const node& a)const{
37         return v > a.v;
38     }
39 } num[N<<1];
40 long long dp[N<<1];
41 void build(){
42     sz = 1; last = 0; val[0= 0; par[0= -1;
43     memset(G[0],0,sizeof(G[0]));
44     int n = strlen(ch);
45     for(int i = 0; i < n; i++) ins(convert(ch[i]));
46     //for(int i = 0; i < sz; i++) cout<<G[i]['x'-'a']<< endl;
47     for(int i = 0; i < sz; i++) dp[i] = -1, cnt[i] = 0;
48     int p = last;
49     while(p) cnt[p]=1, p = par[p];
50     for(int i = 0; i < sz; i++) num[i] = node(i,val[i]);
51     sort(num,num+sz);
52     for(int i = 0; i < sz; i++){
53         int u = num[i].id,v;
54         for(int i = 0; i < 60; i++if(v = G[u][i]) {
55             cnt[u] += cnt[v];
56         }
57     }
58     //for(int i = 0; i < sz; i++) cout<< cnt[i] <<" ";cout<<endl;
59 }
60 long long dfs(int p,int k){
61     long long &ans = dp[p];
62     if(ans != -1return ans ;
63     if(val[par[p]] >= k) {
64         ans = dfs(par[p],k) + 1LL* (val[p] - val[par[p]]) * cnt[p];
65     } else {
66         ans = 1LL * (val[p] - k + 1* cnt[p];
67     }
68     return ans ;
69 }
70 long long solve(int k){
71     int n = strlen(pat), len = 0, p = 0;
72     long long ans = 0;
73     for(int i = 0; i < n; i ++) {
74         int x= convert(pat[i]);
75         while(p && G[p][x] == 0) p = par[p], len = val[p];
76         if(p = G[p][x]){
77             len ++;
78             if(len >= k) {
79                 if(val[par[p]] >= k) ans += 1LL * (len - val[par[p]]) * cnt[p] + dfs(par[p], k);
80                 else ans += 1LL * (len - k + 1* cnt[p];
81             }
82         }
83 //        cout<< pat[i] <<" "<< ans <<" "<<len<<" "<<p<<endl;
84     }
85     return ans ;
86 }
87 int main(){
88     int k ;
89     while(~scanf("%d",&k)&&k){
90         scanf("%s%s",ch,pat);
91         build();
92         cout<< solve(k) << endl;
93     }
94 }
95 

posted on 2012-10-25 19:23 西月弦 閱讀(588) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲网友自拍| 黄色小说综合网站| 午夜精品久久久久久久久久久久| 亚洲日本免费| 日韩亚洲一区二区| 亚洲精品乱码久久久久久| 亚洲国产精品高清久久久| 亚洲清纯自拍| 亚洲欧美激情一区二区| 久久精品亚洲热| 毛片一区二区| 欧美三级在线| 国产主播一区二区三区| 亚洲欧洲日本在线| 亚洲男女自偷自拍| 久久视频国产精品免费视频在线| 蜜臀av性久久久久蜜臀aⅴ| 最新日韩精品| 午夜在线精品偷拍| 蜜桃久久精品乱码一区二区| 亚洲国产美女久久久久| 亚洲视频免费在线观看| 亚洲男人影院| 欧美电影在线| 国内自拍一区| 亚洲伊人伊色伊影伊综合网| 蜜臀av性久久久久蜜臀aⅴ| 国产精品99久久久久久久女警| 欧美在线黄色| 欧美日韩中文在线| 好吊一区二区三区| 亚洲一区二区三区四区五区黄 | 午夜精品视频在线| 欧美成人国产va精品日本一级| 国产精品久久国产愉拍| 亚洲国产成人精品女人久久久| 亚洲欧美成人一区二区三区| 欧美激情1区2区| 欧美伊人久久久久久午夜久久久久| 欧美激情亚洲一区| 在线观看视频日韩| 久久性色av| 欧美在线免费看| 国产精品久久久久高潮| 欧美资源在线| 国产精品日韩专区| 日韩午夜av| 亚洲人永久免费| 欧美成人性生活| 亚洲国产成人久久综合| 久久漫画官网| 久久精品国产999大香线蕉| 国产精品狠色婷| 亚洲深夜福利| 99在线视频精品| 国产精品大全| 欧美一区观看| 午夜影院日韩| 韩国一区二区三区在线观看| 久久不射2019中文字幕| 亚洲欧美成人一区二区在线电影| 欧美亚州在线观看| 亚洲欧美在线一区| 亚洲欧美日韩在线综合| 国产欧美综合一区二区三区| 欧美一区二区三区另类| 亚洲欧美国产精品va在线观看 | 亚洲国产黄色| 欧美成人影音| 欧美精选午夜久久久乱码6080| 99国产精品99久久久久久| 亚洲日本中文字幕免费在线不卡| 欧美黑人多人双交| 亚洲午夜女主播在线直播| 亚洲视频一区二区在线观看 | 在线成人亚洲| 欧美成人综合一区| 欧美ab在线视频| 亚洲最黄网站| 亚洲综合电影一区二区三区| 亚洲一区二区三区精品视频| 国产综合色一区二区三区| 欧美成人乱码一区二区三区| 欧美黄免费看| 午夜欧美精品久久久久久久| 久久精品国亚洲| 日韩一区二区精品在线观看| 亚洲性视频h| 亚洲国产欧美国产综合一区| 在线视频精品一区| 亚洲成人在线视频网站| 99精品国产福利在线观看免费| 国产精品久久久久久av下载红粉 | 欧美日一区二区在线观看| 欧美一级成年大片在线观看| 亚洲欧美日韩系列| 欧美一级视频免费在线观看| 亚洲国产精品123| 亚洲天堂男人| 亚洲精品乱码久久久久久| 午夜一区二区三区在线观看| 一本色道久久综合狠狠躁篇的优点 | 一本色道久久综合亚洲精品婷婷| 亚洲欧美一级二级三级| 夜夜爽www精品| 久久久久久久国产| 亚洲网址在线| 欧美大秀在线观看| 久久精品亚洲一区二区| 欧美激情综合在线| 久久精品国产在热久久| 欧美日韩精品一区视频| 欧美大片va欧美在线播放| 国产亚洲视频在线观看| 一二三区精品福利视频| 亚洲啪啪91| 免播放器亚洲一区| 久久久精品动漫| 国产精品成人观看视频国产奇米| 欧美成人蜜桃| 一区二区亚洲| 久久躁狠狠躁夜夜爽| 国产精品一级| 亚洲午夜av电影| 亚洲桃花岛网站| 欧美日韩一区国产| 亚洲精品综合在线| 99亚洲视频| 欧美精品网站| 亚洲美女在线一区| 中文一区字幕| 欧美亚洲不卡| 亚洲一卡二卡三卡四卡五卡| 亚洲午夜国产一区99re久久 | 一本色道88久久加勒比精品 | 欧美日韩一区二区三区四区在线观看| 欧美va亚洲va国产综合| 亚洲高清不卡一区| 欧美1区2区视频| 亚洲国产色一区| 一区二区日本视频| 欧美久久一区| 国产精品99久久久久久久久| 亚洲一区二区三区三| 国产精品免费一区二区三区观看| 一区二区三区高清在线| 欧美一区二区精品| 黑丝一区二区三区| 欧美激情小视频| 亚洲午夜精品网| 久久久欧美精品sm网站| 亚洲国产成人高清精品| 欧美激情一区二区在线 | 在线视频精品一区| 欧美自拍丝袜亚洲| 在线日韩成人| 欧美日韩精品免费| 香蕉久久国产| 亚洲第一级黄色片| 一本色道久久综合狠狠躁篇怎么玩| 欧美午夜在线观看| 久久精品一本| 亚洲免费观看高清完整版在线观看| 亚洲愉拍自拍另类高清精品| 国产欧美成人| 免费成人在线观看视频| 一区二区三区国产| 欧美xxx成人| 亚洲无线一线二线三线区别av| 国产午夜精品美女毛片视频| 鲁大师影院一区二区三区| 99re8这里有精品热视频免费 | 欧美日韩亚洲一区二区三区四区| 一区二区三区国产在线| 久久久久久久久久久久久久一区 | 免费av成人在线| 亚洲自拍啪啪| 亚洲激情电影在线| 国产精品一区二区三区免费观看| 久久久久久**毛片大全| 在线亚洲一区观看| 美国十次成人| 亚洲一区激情| 日韩午夜一区| 亚洲福利专区| 精品福利免费观看| 国产精品婷婷| 欧美精品一级| 欧美.com| 裸体丰满少妇做受久久99精品| 亚洲亚洲精品三区日韩精品在线视频 | 久久精品亚洲乱码伦伦中文 | 国产精品免费网站| 欧美肥婆在线| 久久激情五月婷婷| 亚洲欧美国产精品桃花| 9l视频自拍蝌蚪9l视频成人| 亚洲国产精品va在看黑人| 久久三级福利| 久久一区激情|