题意:
有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;
}