noip2003 偵探推理 (字串處理)

2021-07-04 22:28:48 字數 2125 閱讀 3327

p1106偵探推理

accepted

標籤:字串

模擬noip提高組2003

明明同學最近迷上了偵探漫畫《柯南》並沉醉於推理遊戲之中,於是他召集了一群同學玩推理遊戲。遊戲的內容是這樣的,明明的同學們先商量好由其中的乙個人充當罪犯(在明明不知情的情況下),明明的任務就是找出這個罪犯。接著,明明逐個詢問每乙個同學,被詢問者可能會說:

證詞中出現的其他話,都不列入邏輯推理的內容。

明明所知道的是,他的同學中有n個人始終說假話,其餘的人始終說真。

現在,明明需要你幫助他從他同學的話中推斷出誰是真正的**,請記住,**只有乙個!

輸入由若干行組成,第一行有二個整數,m(1≤m≤20)、n(1≤n≤m)和p(1≤p≤100);m是參加遊戲的明明的同學數,n是其中始終說謊的人數,p是證言的總數。接下來m行,每行是明明的乙個同學的名字(英文本母組成,沒有主格,全部大寫)。往後有p行,每行開始是某個同學的名宇,緊跟著乙個冒號和乙個空格,後面是一句證詞,符合前表中所列格式。證詞每行不會超過250個字元。

輸入中不會出現連續的兩個空格,而且每行開頭和結尾也沒有空格。

如果你的程式能確定誰是罪犯,則輸出他的名字;如果程式判斷出不止乙個人可能是罪犯,則輸出 cannot determine;如果程式判斷出沒有人可能成為罪犯,則輸出 impossible。

3 1 5

mike

charles

kate

mike:i am guilty.

mike:today is sunday.

charles:mike is guilty.

kate:i am guilty.

kate:how are you??

mike
每個測試點1s

有說一句話的末尾無空格的麼?..

noip2003第二題

解析:直接列舉**是誰,今天星期幾,然後判斷是否合法即可。根據合法的情況數,得到答案。

**:

#include#include#include#define max_m 20

#define max_p 100

#define max_len 250

using namespace std;

int m,n;

char name[max_m+20][max_len+20];

struct tnodeperson[max_m+20];

char zy[5][30]=;

char day[8][20]=;

int lz[5]=;

int ld[8]=;

int ln[max_m+20];

bool used[max_m+20],f[max_m+20];

bool jia[max_m+20];

void readdata()

//check 1

if(strncmp(zy[1],s+l,lz[1])==0)

//注意有人叫 today 的情況

//check 4

if(strncmp(zy[4],s+l,lz[4])==0)

}for(;rm)continue;

l=r+1;

//check 2

if(strncmp(s+l,zy[2],lz[2])==0)

//check 3

if(strncmp(s+l,zy[3],lz[3])==0)

}}int get(int xx,int yy)

if(person[i].xq!=0 && person[i].xq!=yy)

if(person[i].y[xx])

jia[i]=1,sum++;

}for(i=1;i<=m;i++)if(jia[i])

return sum;

}void work()

ans=i;

break; }}

if(ans==0)printf("impossible\n");

else printf("%s\n",name[ans]);

}int main()

NOIP2003 偵探推理

題二 偵探推理 問題描述 明明同學最近迷上了偵探漫畫 柯南 並沉醉於推理遊戲之中,於是他召集了一群同學玩推理遊戲。遊戲的內容是這樣的,明明的同學們先商量好由其中的乙個人充當罪犯 在明明不知情的情況下 明明的任務就是找出這個罪犯。接著,明明逐個詢問每乙個同學,被詢問者可能會說 證詞中出現的其他話,都不...

學習筆記 NOIP 字串

題目鏈結 考慮預處理出所有回文半徑為 i 的回文串個數 cnt i manacher 時進行乙個字首加,差分 字首和處理即可。記錄 題目鏈結 回文串計數。核心思想 記錄 題目鏈結 考慮回文串 s 的回文重心 pos 其在 s 中的回文半徑一定能將其延伸到 s 最後乙個位置。那麼問題等價於找到回文半徑...

NOIP模擬 字串(字尾陣列)

給定兩個字串 s1 和 s2 兩個字串都由 26 個小寫字母中的部分字母構成。現在需要統計 s 2 在 s 1 中出現了的次數。對於 s1 中的每個位置 i 設 st rlen s2 m,若 j 1m s1 i j 1 s 2 j k 最外層中括號為布林表示式 則認為 s2 在 s1 的 i 處出現...