codeforces 508 D. Tanya and Password (fleury算法)

codeforces 508 D. Tanya and Password (fleury算法)

题目链接:

http://codeforces.ru/problemset/problem/508/D

题意:
给出n个长度为3的字符串,如:abc bca aab 如果一个字符串的长度为2的后缀等于,另外一个字符串的长度为2的前缀,则这两个字符串能连起来,比如:aabca,然后这n个字符串可以形成一个图,求图上的一条欧拉通路。
限制:
1 <= n <= 2*10^5,字符串里面有大写字母,小写字母
思路:
把每个字符串当成边,其前缀后缀当作点,如:abc -> ab到bc。
则这个问题化为:有62*62个点,2*10^5条边的图,求一条欧拉通路的题目。
用fleury(弗罗莱),个人感觉用邻接表实现效率比邻接矩阵

ps:这道题dfs会爆栈,把它改成非递归的就行。


附上fleury算法链接

http://www.cnblogs.com/Lyush/archive/2013/04/22/3036659.html


/*codeforces 508 D. Tanya and Password
  题意:
  给出n个长度为3的字符串,如:abc bca aab 如果一个字符串的长度为2的后缀等于,另外一个字符串的长度为2的前缀,则这两个字符串能连起来,比如:aabca,然后这n个字符串可以形成一个图,求图上的一条欧拉通路。
  限制:
  1 <= n <= 2*10^5,字符串里面有大写字母,小写字母
  思路:
  把每个字符串当成边,其前缀后缀当作点,如:abc -> ab到bc。
  则这个问题化为:有62*62个点,2*10^5条边的图,求一条欧拉通路的题目。
  用fleury(弗罗莱),个人感觉用邻接表实现效率比邻接矩阵
ps:这道题dfs会爆栈,把它改成非递归的就行。
 */
#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
#include
       
       
         #include 
         #include 
         
           using namespace std; const int M=200005; const int N=65*65; vector 
          
            mp[N]; int fa[N]; int in[N],out[N]; char ans[M],rev[M]; int len=0; string i2s[N]; map 
           
             s2i; int stk[M],top=0; int getFa(int x){ if(x!=fa[x]) return fa[x]=getFa(fa[x]); return x; } void dfs(int x){ while(mp[x].size()>0){ stk[++top]=x; int ch=mp[x][mp[x].size()-1]; mp[x].pop_back(); x=ch; } stk[++top]=x; } void fleury(int S){ int brige; stk[++top]=S; int flag=0; int tp; while(top>0){ tp=stk[top--]; brige=(mp[tp].size()==0); if(brige){ if(flag) ans[len++]=i2s[tp][0]; else{ ans[len++]=i2s[tp][1]; ans[len++]=i2s[tp][0]; flag=1; } } else dfs(tp); } } int main(){ int n,m; char str[5]; string fr,to; n=0; scanf("%d",&m); for(int i=0;i<65*65;++i) fa[i]=i; for(int i=0;i 
             
            
           
          
       
      
      
     
     
    
    
   
   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值