The 2014 ACM-ICPC Asia Mudanjiang Regional First Round小记


C   

struct  Edge{
        int  v ;
        int  next ;
}e[400008] ;

int  g[100008] ;
bool is[100008] ;
int  id ;
int  a[100008] ;
int  vis[100008] ;
bool can[100008] ;

inline  void  add(int u  , int v){
     e[id].v = v ;
     e[id].next = g[u] ;
     g[u] = id++ ;
}

int   father[100008] ;
int   gf(int x){
      if(x == father[x]) return x ;
      else  return father[x] = gf(father[x]) ;
}

int   n , m ,  k  , L  ;

inline  void meg(int x , int y){
      int fx = gf(x) ;
      int fy = gf(y) ;
      if(fx != fy) father[fx] = fy ;
}

void  dfs(int u , int idx){
      //printf("%d->" , u) ;
      vis[u] = 1 ;
      for(int i = g[u] ; i != -1 ; i = e[i].next){
           int v = e[i].v ;
           if(vis[v] || is[v]){
               meg(v , a[idx]) ;
               continue ;
           }
           if(is[v] && !vis[v]) continue  ;
           meg(v , a[idx]) ;
           dfs(v , idx) ;
      }
}

int   main(){
      int t  , x  , u , v  , i ;
      cin>>t ;
      while(t--){
           scanf("%d%d%d" , &n , &m ,&k) ;
           fill(g , g+n+1 , -1) ;
           fill(is , is+n+1 , 0) ;
           id = 0  ;
           for(i = 1 ; i <= k ; i++){
                scanf("%d" , &x) ;
                is[x] = 1 ;
           }
           while(m--){
                scanf("%d%d" , &u ,&v) ;
                add(u , v);
                add(v , u) ;
           }

           for(i = 1 ; i <= n ; i++) father[i] = i ;
           scanf("%d" , &L) ;
           for(i = 1 ; i <= L ; i++) scanf("%d" , &a[i]) ;

           fill(vis , vis+1+n , 0) ;
           dfs(a[1] , 1) ;
           for(i = 2 ; i <= L ; i++){
                if(gf(a[i-1]) == gf(a[i])) dfs(a[i] , i) ;
                else  break ;
           }
           int yes = 1 ;
           for(i = 1 ; i <= n ; i++){
               if(!vis[i]){
                    yes = 0 ;
                    break ;
               }
           }
           if(yes) puts("Yes") ;
           else    puts("No")  ;
      }
      return  0 ;
}


J  


string  s ;


int  ok1(int len){
     string ab = "" ;
     string ab2 = "" ;
     string a = "" ;
     string b = "" ;
     int i ;
     for(i = 0 ; i < len ; i++)  ab += s[i] ;
     for(i = len ; i < s.length() && i < 2*len ; i++) ab2 += s[i] ;
     if(ab != ab2) return 0 ;
     for(i = 2*len ; i < s.length() ; i++) a += s[i] ;
     if(a == "") return 0 ;
     if(a.length() >= ab.length()) return 0 ;
     string a2 = ab.substr(0 , a.length()) ;
     if(a != a2) return 0 ;
     b = ab.substr(a.length()) ;
     if(a != b) return 1 ;
     return  0 ;
}

int  ok2(int len){
     string ab = "" ;
     string ab2 = "" ;
     string ab3 = "" ;
     string c = "" ;
     int i ;
     for(i = 0 ; i < len ; i++)  ab += s[i] ;
     for(i = len ; i < s.length() && i < 2*len ; i++) ab2 += s[i] ;
     if(ab != ab2) return 0 ;
     for(i = s.length() - len ; i < s.length() ; i++) ab3 += s[i] ;
     if(ab != ab3) return 0 ;
     if(2*len >= s.length() - len) return 0 ;
     for(i = 2*len ; i < s.length() - len ; i++) c += s[i] ;
     if(c == "") return 0 ;
     string A , B  ;
     for(i = 0 ; i < ab.length() ; i++){
          A = ab.substr(0 , i) ;
          B = ab.substr(i) ;
          if(A != "" && B != "" && A != B && A != c && B != c) return 1 ;
     }
     return  0 ;
}


char str[100] ;
int main(){
    int t , i , yes  ;
    cin>>t ;
    while(t--){
         scanf("%s" , &str) ;
         s = "" ;
         for(i = 0 ; i < strlen(str) ; i++){
             if( ('a' <= str[i] && str[i] <= 'z')
                || ('A' <= str[i] && str[i] <= 'Z') )
                s += str[i] ;
         }
         yes = 0 ;
         for(i = 2 ; i <= s.length()/2 ; i++){
             if(ok1(i)){
                   yes = 1 ;
                   break ;
             }
         }
         if(yes){
                puts("Yes") ;
                continue  ;
         }
         for(i = 2 ; i <= s.length()/2 ; i++){
             if(ok2(i)){
                   yes = 1 ;
                   break ;
             }
         }
         if(yes){
                puts("Yes") ;
                continue  ;
         }
         puts("No") ;
    }
    return 0;
}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值