HackerRank Palindromes
2013-09-11 09:09
429 查看
题目在这里
https://www.hackerrank.com/challenges/palindromes
用到了高斯消元
#include "stdio.h"
#include <iostream>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include "string.h"
using namespace std;
double Matrix[1000][1000];
string Normalize(string s){
string res;
int num[26],val=0;
memset(num,-1,sizeof(num));
for(int i=0;i<s.size();i++){
if(num[s[i]-'a']==-1)
num[s[i]-'a']=val++;
res.push_back(('a'+num[s[i]-'a']));
}
return res;
}
map<string,int> ids;
map<string,double> ans;
double solve(string s){
s=Normalize(s);
if(ans.find(s)!=ans.end())
return ans[s];
ids.clear();
string next=s;
sort(next.begin(),next.end());
do{
string next_s=Normalize(next);
if(ids.find(next_s)==ids.end()){
int size=ids.size();
ids[next_s]=size;
}
}while(next_permutation(next.begin(),next.end()));
int N=ids.size(), len=s.size(), swapSize=len*(len-1)/2;
for(int i=0;i<=N;i++)
for(int j=0;j<=N;j++)
Matrix[i][j]=0;
for(map<string,int>::iterator it=ids.begin();it!=ids.end();it++){
string str=it->first;
int id=it->second;
if(Matrix[id]
!=0) continue;
Matrix[id]
=Matrix[id][id]=1;
string tmp=str;
reverse(tmp.begin(),tmp.end());
if(tmp==str){
Matrix[id]
=0;
continue;
}
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
swap(str[i],str[j]);
int id2=ids[Normalize(str)];
Matrix[id][id2]-=1.0/swapSize;
swap(str[i],str[j]);
}
}
}
for(int i=0;i<N;i++){
for(int j=N;j>=i;j--) Matrix[i][j]/=Matrix[i][i];
for(int j=0;j<N;j++){
if(i!=j){
for(int k=N;k>=i;k--)
Matrix[j][k]-=Matrix[i][k]*Matrix[j][i];
}
}
}
for(map<string,int>::iterator it=ids.begin();it!=ids.end();it++){
string str=it->first;
int id=it->second;
if(ans.find(str)==ans.end())
ans[str]=Matrix[id]
;
}
return ans[s];
}
int main(){
int T;
scanf("%d",&T);
for(int t=0;t<T;t++){
string str;
cin>>str;
printf("%.4lf\n",solve(str));
}
}
https://www.hackerrank.com/challenges/palindromes
用到了高斯消元
#include "stdio.h"
#include <iostream>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <algorithm>
#include "string.h"
using namespace std;
double Matrix[1000][1000];
string Normalize(string s){
string res;
int num[26],val=0;
memset(num,-1,sizeof(num));
for(int i=0;i<s.size();i++){
if(num[s[i]-'a']==-1)
num[s[i]-'a']=val++;
res.push_back(('a'+num[s[i]-'a']));
}
return res;
}
map<string,int> ids;
map<string,double> ans;
double solve(string s){
s=Normalize(s);
if(ans.find(s)!=ans.end())
return ans[s];
ids.clear();
string next=s;
sort(next.begin(),next.end());
do{
string next_s=Normalize(next);
if(ids.find(next_s)==ids.end()){
int size=ids.size();
ids[next_s]=size;
}
}while(next_permutation(next.begin(),next.end()));
int N=ids.size(), len=s.size(), swapSize=len*(len-1)/2;
for(int i=0;i<=N;i++)
for(int j=0;j<=N;j++)
Matrix[i][j]=0;
for(map<string,int>::iterator it=ids.begin();it!=ids.end();it++){
string str=it->first;
int id=it->second;
if(Matrix[id]
!=0) continue;
Matrix[id]
=Matrix[id][id]=1;
string tmp=str;
reverse(tmp.begin(),tmp.end());
if(tmp==str){
Matrix[id]
=0;
continue;
}
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
swap(str[i],str[j]);
int id2=ids[Normalize(str)];
Matrix[id][id2]-=1.0/swapSize;
swap(str[i],str[j]);
}
}
}
for(int i=0;i<N;i++){
for(int j=N;j>=i;j--) Matrix[i][j]/=Matrix[i][i];
for(int j=0;j<N;j++){
if(i!=j){
for(int k=N;k>=i;k--)
Matrix[j][k]-=Matrix[i][k]*Matrix[j][i];
}
}
}
for(map<string,int>::iterator it=ids.begin();it!=ids.end();it++){
string str=it->first;
int id=it->second;
if(ans.find(str)==ans.end())
ans[str]=Matrix[id]
;
}
return ans[s];
}
int main(){
int T;
scanf("%d",&T);
for(int t=0;t<T;t++){
string str;
cin>>str;
printf("%.4lf\n",solve(str));
}
}
相关文章推荐
- HackerRank "Square Subsequences" !!!
- [hackerrank]Counting on a tree
- 【Hacker Rank】05.Python: Division
- hackerrank Similar Pair
- Hackerrank——Week of Code 27
- hackerrank DAG Queries 定期重构+bitset
- C++ HackerRank|Simple Text Editor
- [JZOJ5135]逆序对/[HackerRank-101hack43]K-Inversion Permutations
- hackerrank>Dashboard>C++>STL>Lower Bound-STL
- Hackerrank Recurrent on a Tree
- [HackerRank 101 Hack 51] Testing the Game
- hackerrank Word Order
- HackerRank "Arithmetic Expressions" !
- HackerRank网站,为编码程序员们提供一个以编码谜题和现实生活中遇到的编码难题为基础的新兴的社交平台
- hackerrank challenges median
- 【HackerRank】Running Time of Quicksort
- 【HackerRank】Missing Numbers
- 【HackerRank】Median
- HackerRank - The Maximum Subarray
- HackerRank - Counter game