首页 > 代码库 > 脱水缩合
脱水缩合
源代码:#include<cstdio>#include<cstring>#include<queue>#include<string>#define INF 10000007using namespace std;struct Node{ int X,Y;}i[6][37];string S;queue <string> Q;int n,k,Sum[6]={0};int Prime1[6]={13,11,7,5,3,2};int Prime2[6]={17,19,23,29,31,37};bool Flag(0),Vis1[10000007]={0},Vis2[10000007]={0};int main() //我求的是什么,我不知道,但我求出了所有长度为n的可能的合并情况数。{ scanf("%d%d\n",&n,&k); for (int a=0;a<k;a++) { char t,t1,t2; t1=getchar(); t2=getchar(); getchar(); t=getchar(); Sum[t-‘a‘]++; i[t-‘a‘][Sum[t-‘a‘]].X=t1-‘a‘; i[t-‘a‘][Sum[t-‘a‘]].Y=t2-‘a‘; getchar(); } Q.push("a"); //字符串类型STL队列。 Vis1[13]=Vis2[17]=true; while (!Q.empty()) //BFS注意条件,防止死循环。 { S=Q.front(); Q.pop(); int L=S.length(); if (L==n) //后面的肯定更长,跳出。 { Flag=true; break; } char T[6]={0}; for (int a=0;a<L;a++) { int t=S[a]-‘a‘,T1=1,T2=1; for (int b=0;b<a;b++) { T[b]=S[b]; //算是string转char[]。 T1=T1*Prime1[S[b]-‘a‘]%INF*(b+1)%INF; //双重哈希。 T2=T2*Prime2[S[b]-‘a‘]%INF*(b+1)%INF; } for (int b=a+1;b<L;b++) { T[b+1]=S[b]; T1=T1*Prime1[T[b+1]-‘a‘]%INF*(b+2)%INF; T2=T2*Prime2[T[b+1]-‘a‘]%INF*(b+2)%INF; } for (int b=1;b<=Sum[t];b++) { T[a]=i[t][b].X+‘a‘; T[a+1]=i[t][b].Y+‘a‘; int t1=T1,t2=T2; T1=T1*Prime1[T[a]-‘a‘]%INF*(a+1)%INF*Prime1[T[a+1]-‘a‘]%INF*(a+2)%INF; T2=T2*Prime2[T[a]-‘a‘]%INF*(a+1)%INF*Prime2[T[a+1]-‘a‘]%INF*(a+2)%INF; if (!Vis1[T1]||!Vis2[T2]) { string s(T); //char[]转string。 Vis1[T1]=Vis2[T2]=true; Q.push(s); } T1=t1; T2=t2; } } } if (Flag) //特判。 printf("%d",Q.size()+1); else printf("0"); return 0;}/* 倒着来,从"a"开始不断分裂,BFS所有情况即可。 读题还是要细心认真,不要吝惜时间。 血(WA)的教训!*/
脱水缩合
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。