您的位置:首页 > 其它

Codeforces 152C Pocket Book 思维

2017-01-30 18:07 411 查看
点击打开链接

题意:给出n个string,每个长度都为m(n,m<=100).操作i,j,k将swap(i,j)行string的前k字符,问第一行有多少种不同的string?

由样例AAB BAA 容易发现:由于每次交换都为前缀,无论怎么交换,交换多少次,最后string中的第k个字符只可能为某一行的第k个

统计cnt[k] 第k个位置的不同字符个数,计算ans=cnt[1]*..cnt[m]即可 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=2e3+20;
int main()
{
int n,m;
while(cin>>n>>m)
{
ll ans=1;
map<int,int> mp
;//mp[k][c] 第k个字符能否选c
for(int i=1;i<=n;i++)
{
char s
;
scanf("%s",s+1);
for(int k=1;k<=m;k++)
{
mp[k][s[k]-'A'+1]=1;
}
}
for(int i=1;i<=m;i++)
{
ll cnt=0;
for(int j=1;j<=26;j++)
{
if(mp[i][j])
cnt++;
}
ans=(ans*cnt)%mod;
}
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: