問題はこちら
http://nabetani.sakura.ne.jp/hena/ord14crosscircle/
他の解答例はこちら
http://qiita.com/Nabetani/items/66806c9dc14a96f2fd42
*** aabbca1bcb
のときを例に解説 ***
<概要>
このコードは、円周上に並んだ点aabbca1bcb
に1本ずつ線を引いていき、
その線を引いた時に交差した線の本数を積算しています。
<流れ>
最初は、円周上にaabbca1bcb
と点が並んでいるだけで、線は一本も引かれていない状態です。
まず先頭のa
から線を引きます。2番目のa
と6番目のa
に線が1本ずつ引けるので、それぞれのLineCnt
をカウントアップします。この2本の線を引いたときには1本も線を交差しないので、交点の数p
は0のまま。
次に2番目のa
から線を引きます。6番目のa
に線が1本引けるので、6番目のa
のLineCnt
をカウントアップします。この線を引いた時も1本も線を交差しないので、交点の数p
は0のまま。
次に3番目のb
から線を引きます。4番目、8番目、10番目のb
に線が引けるので、それぞれのLineCnt
をカウントアップします。8番目と10番目の線を引くときに、6番目のa
の線2本と交差するので、p
は4となります。
この作業を最後の文字まで繰り返せば、すべての交点の数を数えることができます。
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int c[100];
} LineCnt;
int solve(const char *in)
{
LineCnt l={0}, t={0};
int i, j, p=0, tp=0;
for(i=0; in[i]!='\0'; i++, l=t, tp=0) {
for(j=i+1; in[j]!='\0'; j++) {
if(in[j]==in[i]) {
t.c[j]++;
p+=tp;
}
tp += l.c[j];
}
}
return p;
}
void test(const char *in, const char *a)
{
int r = solve(in);
printf("%d\t%s\n", r, (r==atoi(a)) ? "ok": "***NG***");
}
int main()
{
/*0*/ test( "aabbca1bcb", "14" );
/*1*/ test( "111ZZZ", "0" );
/*2*/ test( "v", "0" );
/*3*/ test( "ww", "0" );
/*4*/ test( "xxx", "0" );
/*5*/ test( "yyyy", "1" );
/*6*/ test( "zzzzz", "5" );
/*7*/ test( "abcdef", "0" );
/*8*/ test( "abcaef", "0" );
/*9*/ test( "abbaee", "0" );
/*10*/ test( "abcacb", "2" );
/*11*/ test( "abcabc", "3" );
/*12*/ test( "abcdabcd", "6" );
/*13*/ test( "abcadeabcade", "23" );
/*14*/ test( "abcdeedcba", "0" );
/*15*/ test( "abcdeaedcba", "8" );
/*16*/ test( "abcdeaedcbad", "16" );
/*17*/ test( "QQQQXXXX", "2" );
/*18*/ test( "QwQQmQXmXXwX", "14" );
/*19*/ test( "111222333", "0" );
/*20*/ test( "aaAAaA", "4" );
/*21*/ test( "121232313", "12" );
/*22*/ test( "1ab1b", "1" );
/*23*/ test( "abcdefbadcfe", "12" );
/*24*/ test( "abxcdefbadcfex", "14" );
/*25*/ test( "dtnwtkt", "0" );
/*26*/ test( "mvubvpp", "0" );
/*27*/ test( "moggscd", "0" );
/*28*/ test( "kzkjzpkw", "2" );
/*29*/ test( "fbifybre", "1" );
/*30*/ test( "rrrfjryki", "1" );
/*31*/ test( "wrbbdwsdwtx", "2" );
/*32*/ test( "vvucugvxbvgx", "9" );
/*33*/ test( "ojkjzyasjwbfjj", "5" );
/*34*/ test( "ggffyuxnkyypifff", "5" );
/*35*/ test( "vcgtcqlwrepwvkkogl", "4" );
/*36*/ test( "xeqtmmgppwcjpcisogxbs", "4" );
/*37*/ test( "lukltpeucrqfvcupnpxwmoj", "6" );
/*38*/ test( "zpzswlkkoqwwndwpfdpkhtzgtn", "31" );
/*39*/ test( "bkfeflagfvluelududqjcvfyvytfw", "45" );
/*40*/ test( "rvqbhfmcjjqlpqzulzerxgyowiwrfkmhw", "26" );
/*41*/ test( "qyxvpdtoeexbqsethwjwmqszcxxjnsdoeaet", "144" );
/*42*/ test( "rjmsgmswhcolmpbhmpncziymydyalrcnevsrespj", "133" );
/*43*/ test( "oxetnyjzjbysnwktfwzndlejfndsqeetsnjvsicyjehd", "395" );
/*44*/ test( "wzvddnddzogywcqxbyvagbzmsmtcmrrlbnebmvhaemjouaqim", "219" );
/*45*/ test( "karhphxcxqgsyorhusbumbqzocuzvnwzwcpxgsksrviihxrgsrhji", "461" );
/*46*/ test( "oxgbononhqdxzmkysgijwvxljpaazmgkurkpffeuwywwuyxhyfkicgyzyc", "441" );
/*47*/ test( "sdgsrddwsrwqthhdvhrjhgtxwgurgyiygtktgtughtogzaqmcafkljgpniddsvb", "1077" );
/*48*/ test( "qemhecchkgzhxmdcsltwhpoyhkapckkkzosmklcvzkiiucrvzzznmhjfcdumuflavxik", "1711" );
/*49*/ test( "ffqmsirwpxrzfkbvmmfeptkbhnrvfcywthkwkbycmayhhkgvuyecbwwofwthlmzruphrcujwhr", "2440" );
return 0;
}