F. Palindrome

来源:互联网 发布:java web框架最新技术 编辑:程序博客网 时间:2024/06/07 00:28

题意:

有n个字符,里面有?,可以表示任何字母,在满足m个约束条件的情况下,
求出有多少种可能,记得mod一个大数。

思路:

重要的是要分情况,一个?在计算的时候,只能是1或者26种可能,所以
用并查集去区分它们。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 50005;char s[MAXN];int n,m;int f[MAXN],flag;int Find(int x){    if(x == f[x])        return x;    else return f[x] = Find(f[x]);}void judge(int x,int y){    if(s[x] == s[y])        f[x] = y;    else if(s[x] == '?')        f[x] = y;    else if(s[y] == '?')        f[y] = x;    else flag = true;}int main(){    //freopen("in.txt","r",stdin);    int ncase;    scanf("%d",&ncase);    while(ncase--) {        flag = false;        scanf("%d%d%s",&n,&m,s);        for(int i = 0;i < n; i++)            f[i] = i;        for(int i = 0,j = n-1;i < j; i++,j--) {            judge(i,j);        }        for(int i = 0;i < m; i++) {            int a,b;            scanf("%d%d",&a,&b);            a--,b--;            judge(Find(a),Find(b));        }        if(flag) {            printf("0\n");            continue;        }        else {            long long ans = 1;            for(int i = 0;i < n; i++) {                if(f[i] == i && s[i] == '?') {                    ans *= 26;                    ans %= 1000000007;                }            }            printf("%lld\n",ans);        }    }    return 0;}
0 0