题意:n个串,每个串的长度为k,串只含有SET三种字母,如果有三个串符合每个位置的字母都不同或者每个位置的字母都相同,那他们就是符合条件的一组,要求统计有多少组符合题意。n(1e3) k(30)。
思路:如果暴力枚举就是n3方会T,用map把每个串的序号存下来,通过枚举两个串,构造出第三个符合条件的串,看看有没有出现,有的话ans+1。
AC代码:复杂度nk
1 #include<iostream> 2 #include<map> 3 #include<string.h> 4 using namespace std; 5 6 map<string,int> p; 7 int n,k; 8 char s[1510][35]; 9 10 11 int main(){ 12 cin>>n>>k; 13 for(int i=1;i<=n;i++){ 14 cin>>s[i]; 15 p[s[i]]=i; 16 } 17 int num=0; 18 for(int i=1;i<=n;i++){ 19 for(int j=i+1;j<=n;j++){ 20 string hjj=""; 21 for(int t=0;t<k;t++){ 22 if(s[i][t]==s[j][t]) hjj+=s[i][t]; 23 else{ 24 if(s[i][t]!='E'&&s[j][t]!='E') hjj+='E'; 25 if(s[i][t]!='T'&&s[j][t]!='T') hjj+='T'; 26 if(s[i][t]!='S'&&s[j][t]!='S') hjj+='S'; 27 } 28 } 29 if(p.count(hjj)&& p[hjj]>i&&p[hjj]>j ) num++; 30 } 31 } 32 cout<<num; 33 }