ACM Arabella Collegiate Programming Contest 2015 F. Palindrome 并查集

本文主要是介绍ACM Arabella Collegiate Programming Contest 2015 F. Palindrome 并查集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:http://codeforces.com/gym/100676/attachments

题意: 

给一个字符串,有一些约束条件,两个位置要相同,有一些是问号,求最后有多少种方案回文?

 

分析:

每一个节点是一个集合,要是不同,有一个是问号,那么这个问号就是确定的(约束条件中,和回文的对称位置),单独的集合,他又是问号,就可以放26个字母了;

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 const int MAXN = 50005;
 8 
 9 char s[MAXN];
10 int n,m;
11 int f[MAXN],flag;
12 
13 int Find(int x)
14 {
15     if(x == f[x])
16         return x;
17     else return f[x] = Find(f[x]);
18 }
19 
20 void judge(int x,int y)
21 {
22     if(s[x] == s[y])
23         f[x] = y;
24     else if(s[x] == '?')
25         f[x] = y;
26     else if(s[y] == '?')
27         f[y] = x;
28     else flag = true;
29 }
30 
31 int main()
32 {
33     //freopen("in.txt","r",stdin);
34     int ncase;
35     scanf("%d",&ncase);
36     while(ncase--) {
37         flag = false;
38         scanf("%d%d%s",&n,&m,s);
39         for(int i = 0;i < n; i++)
40             f[i] = i;
41         for(int i = 0,j = n-1;i < j; i++,j--) {
42             judge(i,j);
43         }
44         for(int i = 0;i < m; i++) {
45             int a,b;
46             scanf("%d%d",&a,&b);
47             a--,b--;
48             judge(Find(a),Find(b));
49         }
50         if(flag) {
51             printf("0\n");
52             continue;
53         }
54         else {
55             long long ans = 1;
56             for(int i = 0;i < n; i++) {
57                 if(f[i] == i && s[i] == '?') {
58                     ans *= 26;
59                     ans %= 1000000007;
60                 }
61             }
62             printf("%lld\n",ans);
63         }
64     }
65     return 0;
66 }
View Code

 

转载于:https://www.cnblogs.com/TreeDream/p/6746088.html

这篇关于ACM Arabella Collegiate Programming Contest 2015 F. Palindrome 并查集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/230847

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

poj 1182 并查集 食物链类

题意: 有n只动物,分别编号1....n。所有动物都属于A,B,C中的一种,已知A吃B,B吃C,C吃A。 按顺序给出下面两种共K条信息: 1. x 和 y 属于同一类。 2. x 吃 y 。 然而这些信息可能会出错,有可能有的信息和之前给出的信息矛盾,也有的信息可能给出的 x 和 y 不在n的范围内。 求k条信息中有多少条是不正确的。 解析: 对于每只动物,创建3个元素 i

2014 Multi-University Training Contest 8小记

1002 计算几何 最大的速度才可能拥有无限的面积。 最大的速度的点 求凸包, 凸包上的点( 注意不是端点 ) 才拥有无限的面积 注意 :  凸包上如果有重点则不满足。 另外最大的速度为0也不行的。 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct poin

2014 Multi-University Training Contest 7小记

1003   数学 , 先暴力再解方程。 在b进制下是个2 , 3 位数的 大概是10000进制以上 。这部分解方程 2-10000 直接暴力 typedef long long LL ;LL n ;int ok(int b){LL m = n ;int c ;while(m){c = m % b ;if(c == 3 || c == 4 || c == 5 ||

2014 Multi-University Training Contest 6小记

1003  贪心 对于111...10....000 这样的序列,  a 为1的个数,b为0的个数,易得当 x= a / (a + b) 时 f最小。 讲串分成若干段  1..10..0   ,  1..10..0 ,  要满足x非递减 。  对于 xi > xi+1  这样的合并 即可。 const int maxn = 100008 ;struct Node{int

POJ1988带权并查集

M u v 将u所在的堆移动到v所在的堆的上面 C u 求u的下面有多少块 带权并查集 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;i

POJ1703带权并查集

D: u v  u与v在不同的集合 A: u v  查询u与v的关系 1)压缩路径过程        fu->root   0  1  u-fu 0                 0  1   1                 1  0 2)合并过程 fu->fv      u->fu   0 1   v->fv 0            1 0 1            0

ural 1297. Palindrome dp

1297. Palindrome Time limit: 1.0 second Memory limit: 64 MB The “U.S. Robots” HQ has just received a rather alarming anonymous letter. It states that the agent from the competing «Robots Unli

AtCoder Beginner Contest 370 Solution

A void solve() {int a, b;qr(a, b);if(a + b != 1) cout << "Invalid\n";else Yes(a);} B 模拟 void solve() {qr(n);int x = 1;FOR(i, n) FOR(j, i) qr(a[i][j]);FOR(i, n) x = x >= i ? a[x][i]: a[i][x];pr2(

并查集基础与简单扩展应用

并查集 基础题目路径压缩 扩展应用扩展题目1扩展题目2 并查集的结构是一棵树 并查集有两种功能,一种是判断两个元素是否在同一集合,第二种是合并两个集合 并查集的实现需要记录每个节点的父亲节点 判断两个元素是否在同一集合,即判断两个元素的祖宗节点是否是一个节点(祖宗代表整棵树的根节点) 合并两个集合,即将任意一个集合祖宗的爸爸改为另一个集合的祖宗 基础题目 一共有