Finding Palindromes POJ - 3376(Trie树&&扩展KMP)

Finding Palindromes

 POJ - 3376

题意:给n个串,任意两个组合,有n*n种组合,问有多少种是回文串。

Trie树+扩展KMP。。。

我用的LRJ的Trie树模板超内存=_=||

又用了带指针的那种~

时隔五个月的一道题,今天终于干掉了=_=||

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4 const int maxnode=2000010;
 5 const int sigma=26;
 6 #define ll long long
 7 int bg[maxnode],ed[maxnode];
 8 char s[maxnode],t[maxnode];
 9 int flag[2][maxnode];
10 int len;
11 int nex[maxnode],ex[maxnode];
12 
13 
14 struct Node{
15     Node* ch[sigma];
16     int  v1,v2;
17 };
18 Node node[maxnode];
19 int cnt;
20 Node* rt;
21 ll ans;
22 
23 void insert_(char* s,int l,int r){
24     Node* temp=rt;
25     for(int i=l;i<r;i++){
26         int c=s[i]-'a';
27         temp->v1+=flag[0][i];
28         if(temp->ch[c]==NULL ) temp->ch[c]=&node[cnt++];
29         temp=temp->ch[c];
30     }
31     (temp->v2)++;
32 }
33 void query(char* s,int l,int r){
34     Node* temp=rt;
35     for(int i=l;i<r;i++){
36         int c=s[i]-'a';
37         temp=temp->ch[c];
38         if(temp==NULL) break;
39         if(i<r-1&&flag[1][i+1]||i==r-1) ans+=temp->v2;
40     }
41     if(temp) ans+=temp->v1;
42 }
43 
44 void getnex(char* t,int l,int r){
45     nex[l]=r-l;
46     int a=0,p=0;
47     for(int i=1;i<r-l;i++){
48         if(i>=p||i+nex[i-a+l]>=p){
49             if(i>=p) p=i;
50             while(p<r-l&&t[p+l]==t[p-i+l]) p++;
51             nex[i+l]=p-i;
52             a=i;
53         }else nex[i+l]=nex[i-a+l];
54     }
55 }
56 
57 void exkmp(char* s,char* t,int l,int r,int b){
58     getnex(t,l,r);
59     int a=0,p=0;
60     for(int i=0;i<r-l;i++){
61         if(i>=p||i+nex[i-a+l]>=p){
62             if(i>=p) p=i;
63             while(p<r-l&&s[p+l]==t[p-i+l]) p++;
64             ex[i+l]=p-i;
65             a=i;
66         }else ex[i+l]=nex[i-a+l];
67     }
68     for(int i=l;i<r;i++){
69         if(i+ex[i]==r) flag[b][i]=1;
70     }
71 }
72 
73 int main(){
74     int n;
75     while(scanf("%d",&n)!=EOF){
76         cnt=0;
77         ans=0;
78         memset(node,0,sizeof(node));
79         memset(flag,0,sizeof(flag));
80         rt=&node[cnt++];
81         int L=0;
82         for(int i=0;i<n;i++){
83             scanf("%d%s",&len,s+L);
84             bg[i]=L;ed[i]=L+len;
85             for(int j=0;j<len;j++) t[j+L]=s[L+len-j-1];
86             L+=len;
87             exkmp(s,t,bg[i],ed[i],0);
88             exkmp(t,s,bg[i],ed[i],1);
89             insert_(s,bg[i],ed[i]);
90         }
91         for(int i=0;i<n;i++) {
92                 query(t,bg[i],ed[i]);
93         }
94         printf("%lld\n",ans);
95     }
96     return 0;
97 }
View Code

 

补上用前向星存边的Trie树,内存省了好多~也快了一倍~

  1 #include <cstdio>
  2 #include <cstring>
  3 using namespace std;
  4 const int maxnode=2000010;
  5 const int sigma=26;
  6 #define ll long long
  7 int bg[maxnode],ed[maxnode];
  8 char s[maxnode],t[maxnode];
  9 int flag[2][maxnode];
 10 int len;
 11 int nex[maxnode],ex[maxnode];
 12 
 13 //Trie树
 14 struct Trie{
 15     int head[maxnode],nex[maxnode];
 16     int v1[maxnode],v2[maxnode];
 17     char ch[maxnode];
 18     int sz;
 19     ll ans;
 20 
 21     void init(){
 22         memset(v1,0,sizeof(v1));
 23         memset(v2,0,sizeof(v2));
 24         memset(ch,0,sizeof(ch));
 25         head[0]=nex[0]=-1;
 26         sz=1;
 27         ans=0;
 28     }
 29 
 30     void insert_(char* s,int l,int r){
 31         int u=0,v;
 32         for(int i=l;i<r;i++){
 33             int ok=0;
 34             v1[u]+=flag[0][i];
 35             for(v=head[u];~v;v=nex[v]) if(ch[v]==s[i]){
 36                 ok=1;
 37                 break;
 38             }
 39             if(!ok){
 40                 v=sz++;
 41                 ch[v]=s[i];
 42                 nex[v]=head[u];
 43                 head[u]=v;
 44                 head[v]=-1;
 45             }
 46             u=v;
 47         }
 48         v2[u]++;
 49     }
 50 
 51     void query(char* s,int l,int r){
 52         int u=0,v;
 53         for(int i=l;i<r;i++){
 54             int ok=0;
 55             for(v=head[u];~v;v=nex[v]) if(ch[v]==s[i]){
 56                 ok=1;
 57                 u=v;
 58                 break;
 59             }
 60            if(!ok) return ;
 61            if(v2[u]){
 62             if(i<r-1&&flag[1][i+1]||i==r-1) ans+=v2[u];
 63            }
 64         }
 65         ans+=v1[u];
 66     }
 67 };
 68 
 69 
 70 Trie trie;
 71 
 72 void getnex(char* t,int l,int r){
 73     nex[l]=r-l;
 74     int a=0,p=0;
 75     for(int i=1;i<r-l;i++){
 76         if(i>=p||i+nex[i-a+l]>=p){
 77             if(i>=p) p=i;
 78             while(p<r-l&&t[p+l]==t[p-i+l]) p++;
 79             nex[i+l]=p-i;
 80             a=i;
 81         }else nex[i+l]=nex[i-a+l];
 82     }
 83 }
 84 
 85 void exkmp(char* s,char* t,int l,int r,int b){
 86     getnex(t,l,r);
 87     int a=0,p=0;
 88     for(int i=0;i<r-l;i++){
 89         if(i>=p||i+nex[i-a+l]>=p){
 90             if(i>=p) p=i;
 91             while(p<r-l&&s[p+l]==t[p-i+l]) p++;
 92             ex[i+l]=p-i;
 93             a=i;
 94         }else ex[i+l]=nex[i-a+l];
 95     }
 96     for(int i=l;i<r;i++){
 97         if(i+ex[i]==r) flag[b][i]=1;
 98     }
 99 }
100 
101 int main(){
102     int n;
103     while(scanf("%d",&n)!=EOF){
104         trie.init();
105         memset(flag,0,sizeof(flag));
106         int L=0;
107         for(int i=0;i<n;i++){
108             scanf("%d%s",&len,s+L);
109             bg[i]=L;ed[i]=L+len;
110             for(int j=0;j<len;j++) t[j+L]=s[L+len-j-1];
111             L+=len;
112             exkmp(s,t,bg[i],ed[i],0);
113             exkmp(t,s,bg[i],ed[i],1);
114             trie.insert_(s,bg[i],ed[i]);
115         }
116         for(int i=0;i<n;i++) {
117                 trie.query(t,bg[i],ed[i]);
118         }
119         printf("%lld\n",trie.ans);
120     }
121     return 0;
122 }
View Code

 

转载于:https://www.cnblogs.com/yijiull/p/7412559.html

### 回答1: ChIP-seq(Chromatin Immunoprecipitation sequencing)是一种用于研究基因组上转录因子和其他蛋白质与DNA相互作用的方法。它通过先对特定蛋白质与DNA的结合位点进行免疫沉淀,再对沉淀下来的DNA片段进行测序来确定该蛋白质结合的基因位点。 CUT(Chromatin Uptake Test)是一种用于评估基因组上DNA片段与转录因子结合位点的灵敏度和特异性的方法。它通过将转录因子和指定的DNA片段混合,再检测该片段与转录因子的结合情况,来评估该片段是否是有效的转录因子结合位点。 ### 回答2: &RUN和CUT&RUN。 ChIP-seq (染色质免疫共沉淀测序)是一种广泛应用于研究DNA与蛋白质相互作用的技术。它通过特定抗体选择性地富集感兴趣的染色质区域,然后将富集的DNA进行测序,从而揭示DNA上与特定蛋白质的结合位点。这种技术常用于研究转录因子结合位点、组蛋白修饰和表观遗传学等领域。ChIP-seq技术的发展使得我们能够全面了解基因组中与蛋白质结合相关的生物学事件。 CUT&RUN (在位关联与次世代测序)是一种近年来涌现的新技术,用于研究蛋白质-DNA相互作用。CUT&RUN利用转录因子结合的DNA线索,将固定在细胞核中蛋白质DNA复合物释放,并以线粒体在胞浆液相中的镍作为固定荧光探针依赖式的。”CLEUR-inatableCLEUR发发挥增长实际形态用聚合物精确分子一次性直到整个复习常常经历。这种华丽奇妙的结果将DNA定点修复到某些酶反应的消息。 ChIP-seq和CUT&RUN都是现代生命科学中常用的技术,用于揭示蛋白质-DNA相互作用引发的生物学进程。虽然它们基本原理不同,但这两种技术的应用领域有许多重叠之处。使用这些技术,科学家可以研究基因组中特定区域的结构和功能,从而深入理解遗传和表观遗传学机制。 ### 回答3: &Tag=biotech.chapter.peak.finding and differential binding analysis ChIP-seq(染色质免疫沉淀测序)和CUT(染色质核苷酸可及性测序)是两种在研究染色质调控方面广泛使用的测序技术。 ChIP-seq是通过免疫沉淀染色质中特定蛋白质结合的DNA片段,并使用高通量测序技术对其进行测序。这种技术可以用来研究蛋白质与特定基因座的相互作用,从而帮助我们了解基因调控的分子机制。通过ChIP-seq,我们可以鉴定蛋白质结合位点的位置,进而确定哪些区域与基因表达相关。此外,ChIP-seq还可以用于研究转录因子的结合位点、组蛋白修饰和染色质重塑等过程。 CUT是一种用于研究染色质核苷酸可及性的测序技术。通过CUT技术,可以高通量测定染色质中DNA的特定区域是否处于开放的染色质结构。开放的染色质结构通常与基因的转录活性相关。CUT可以通过抑制DNA甲基化酶或降低染色质的凝结程度来确定染色质核苷酸的可及性。CUT技术还可以用于研究染色质可及性与某些疾病和发育过程之间的关联。 总而言之,ChIP-seq和CUT是两种重要的染色质测序技术,可以帮助我们揭示染色质调控的分子机制。ChIP-seq可以鉴定蛋白质结合位点,而CUT可以测定染色质核苷酸的可及性。这些技术的应用有助于我们进一步了解基因调控、转录因子结合、染色质修饰和疾病发生等过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值