这两题都不难,但都是一样的套路我做第一题的时候没想出来。
从前往后暴力累加答案的同时,可以把前面出现过的值用一个map数组累加起来,就很方便了。
CF1287B
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N= 2e3 + 5 ;
int n, m, ans;
string s[ N] ;
map< string, int > f;
signed main ( ) {
scanf ( "%lld%lld" , & n, & m) ;
for ( register int i= 1 ; i<= n; ++ i) cin>> s[ i] ;
for ( register int i= 1 ; i<= n; ++ i)
{
for ( register int j= i+ 1 ; j<= n; ++ j)
{
string ss= "" ;
for ( register int k= 0 ; k< m; ++ k)
{
if ( s[ i] [ k] == s[ j] [ k] ) ss+ = s[ i] [ k] ;
else
{
if ( s[ i] [ k] != 'S' && s[ j] [ k] != 'S' ) ss+ = 'S' ;
if ( s[ i] [ k] != 'E' && s[ j] [ k] != 'E' ) ss+ = 'E' ;
if ( s[ i] [ k] != 'T' && s[ j] [ k] != 'T' ) ss+ = 'T' ;
}
}
ans+ = f[ ss] ;
}
f[ s[ i] ] ++ ;
}
printf ( "%lld\n" , ans) ;
return 0 ;
}
CF567C
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N= 2e5 + 5 ;
int n, m, ans;
int a[ N] ;
map< int , int > sum1, sum2;
signed main ( ) {
scanf ( "%lld%lld" , & n, & m) ;
for ( register int i= 1 ; i<= n; ++ i) scanf ( "%lld" , & a[ i] ) , sum2[ a[ i] ] ++ ;
for ( register int i= 1 ; i<= n; ++ i)
{
sum2[ a[ i] ] -- ;
if ( a[ i] % m== 0 ) ans+ = sum1[ a[ i] / m] * sum2[ a[ i] * m] ;
sum1[ a[ i] ] ++ ;
}
printf ( "%lld\n" , ans) ;
return 0 ;
}