QOJ.ac

QOJ

حد الوقت: 3 s حد الذاكرة: 384 MB مجموع النقاط: 100 الصعوبة: [عرض]

#1788. תקשורת קוונטית

الإحصائيات

小 Z לומד בעצמו על מחשבים קוונטיים. לאחרונה הוא חוקר את הפרק על תקשורת קוונטית ונתקל בבעיה מעניינת. בבעיה זו Alice ו־Bob מקיימים תקשורת קוונטית. שפת התקשורת שלהם היא מילון $S$ בגודל $n$, שבו כל מילה $s_i$, כאשר $1\leq i\leq n$, מיוצגת במחרוזת בינארית בת $256$ סיביות. בשאלה זו אפשר ליצור את $s_i$ באמצעות הפונקציה gen, המופיעה בקובץ gen.cpp שבתיקיית השאלה. הפרמטרים שלה, n, a1, a2, יינתנו בקלט.

Alice ו־Bob עומדים לבצע $m$ שידורים. בכל שידור Alice שולחת ל־Bob בדיוק מילה אחת מהמילון. אולם ערוץ התקשורת אינו אמין ונתון לרעש. ליתר דיוק, אם המילה המקורית בשידור ה־$i$ היא $x_i$, הרעש יכול להפוך לכל היותר $k_i$ סיביות בה. כלומר, המחרוזת הבינארית $y_i$ שקיבל Bob עשויה להיות שונה מ־$x_i$ בלכל היותר $k_i$ סיביות, וייתכן שאינה מופיעה במילון $S$.

בינתיים מגלה Bob שהנבל Eve חדר גם הוא לערוץ ומתכנן לשבש את התקשורת. הוא יכול לשנות את המחרוזת שקיבל Bob לכל מחרוזת בינארית בת $256$ סיביות, שגם היא עשויה לא להופיע במילון $S$. Eve ערמומי מאוד, והוא לא בהכרח משבש כל שידור.

כעת Bob מבקש את עזרתכם. לכל שידור עליכם לקבוע, לפי המחרוזת הסופית שקיבל ולפי סף הרעש $k_i$, כאשר $0\leq k_i\leq15$, אם ייתכן שהשידור לא שובש על ידי Eve. כלומר, האם אפשר לקבל את המחרוזת שקיבל Bob על ידי הפיכת לכל היותר $k_i$ סיביות במילה כלשהי במילון? אם ייתכן שלא היה שיבוש של Eve, הדפיסו $1$; אחרת הדפיסו $0$. Bob סומך על יכולתכם, ולכן עליכם לענות על השאילתות באופן מקוון, לפי הדרישות בפורמט הקלט.

כדי להפחית את זמן הקריאה, המחרוזות שקיבל Bob ניתנות כמחרוזות הקסדצימליות באורך $64$. הן מכילות את הספרות 0 עד 9 ואת האותיות האנגליות הגדולות A עד F, המציינות את הערכים $10$ עד $15$, בהתאמה.

אפשר להמיר מחרוזת הקסדצימלית לבינארית תו אחר תו. לדוגמה: 5 מתאים ל־0101, האות A ל־1010, והאות C ל־1100.

קלט

יש לקרוא את הנתונים מהקובץ qi.in.

השורה הראשונה מכילה ארבעה מספרים שלמים אי־שליליים $n,m,a_1,a_2$, המציינים בהתאמה את גודל המילון, את מספר השידורים ואת הערכים ההתחלתיים של הפרמטרים a1, a2 בפונקציה gen.

עליכם לקרוא בתוכנית שלכם לפונקציה gen המוזכרת בתיאור הבעיה כדי ליצור את רשימת המילים. אפשר להעתיק ולהשתמש בקוד שב־gen.cpp. המערך הבוליאני s[N+1][256] בתוכנית מכיל את כל המילים.

כל אחת מ־$m$ השורות הבאות מכילה מחרוזת הקסדצימלית באורך $64$ ומספר שלם אי־שלילי $k_i$, המציינים בהתאמה את המחרוזת הבינארית הסופית שקיבל Bob בשידור ה־$i$ ואת סף הרעש.

כדי לחייב מענה מקוון, לאחר המרת המחרוזת ההקסדצימלית למחרוזת בינארית בת $256$ סיביות יש לבצע XOR של כל סיבית עם $lastans$ כדי לקבל את המחרוזת האמיתית שקיבל Bob בשידור הזה. כאן $lastans\in\{0,1\}$ הוא התשובה לשאילתה הקודמת, וערכו ההתחלתי לפני השאילתה הראשונה הוא $0$.

שימו לב: בעת שימוש ב־scanf וב־printf לקריאה או לכתיבה של משתנים מסוג unsigned long long, מציין הפורמט המתאים הוא llu.

פלט

יש לכתוב את הפלט לקובץ qi.out.

יש להדפיס $m$ שורות, ובכל אחת מספר שלם $0$ או $1$ המציין את התשובה לשאילתה הנוכחית.

דוגמאות לשאילתות

כדי להסביר את הבעיה, נציג מקרה פשוט יותר: המילים במילון נתונות ישירות, אורכן מקוצר לארבע סיביות, ומותר לענות על השאילתות באופן לא מקוון.

נניח שגודל המילון $n=2$, ומילותיו הן 1010 ו־0111.

עבור השאילתה B = 1011 ו־$k_1=1$, התשובה היא $1$: אפשר להפוך את הסיבית הרביעית של 1010, כאשר סופרים מהסיבית הגבוהה לנמוכה, וכך גם בהמשך.

עבור השאילתה 1 = 0001 ו־$k_2=2$, התשובה היא $1$: אפשר להפוך את הסיביות השנייה והשלישית של 0111.

עבור השאילתה 1 = 0001 ו־$k_3=1$, התשובה היא $0$.

  • בהפיכת לכל היותר סיבית אחת ב־1010 אפשר לקבל 1010, 0010, 1110, 1000, 1011.
  • בהפיכת לכל היותר סיבית אחת ב־0111 אפשר לקבל 0111, 1111, 0011, 0101, 0110.
  • אי אפשר לקבל 1 = 0001, ולכן הוא בוודאות התקבל משיבוש של Eve.

דוגמאות

דוגמה 1

ראו את הקבצים qi/qi1.in ו־qi/qi1.ans בתיקיית המתחרה.

דוגמה 2

ראו את הקבצים qi/qi2.in ו־qi/qi2.ans בתיקיית המתחרה.

דוגמה 3

ראו את הקבצים qi/qi3.in ו־qi/qi3.ans בתיקיית המתחרה.

מגבלות מקרי הבדיקה

לכל מקרי הבדיקה מתקיים $1\leq n\leq4\times10^5$, $1\leq m\leq1.2\times10^5$, $0\leq k\leq15$. המספרים $a_1,a_2$ נוצרים באקראי ובאופן אחיד בטווח $[0,2^{64}-1]$.

מספר מקרה הבדיקה $n=$ $m=$ $k_i\leq$ תכונה מיוחדת
$1$ $10$ $10$ $2$ אין
$2$ $500$ $500$ $15$ אין
$3$ $1000$ $1000$ $0$ אין
$4$ $2000$ $2000$ $2$ אין
$5$ $5000$ $5000$ $15$ אין
$6$ $10000$ $10000$ $15$ אין
$7$ $20000$ $20000$ $15$ אין
$8$ $100000$ $100000$ $1$ אין
$9$ $400000$ $120000$ $1$ אין
$10$ $50000$ $50000$ $2$ אין
$11$ $70000$ $70000$ $3$ אין
$12$ $100000$ $100000$ $2$ אין
$13$ $30000$ $30000$ $5$ אין
$14$ $60000$ $60000$ $4$ אין
$15$ $120000$ $120000$ $5$ אין
$16$ $60000$ $60000$ $8$ כל מחרוזות השאילתות נוצרות באקראי
$17$ $120000$ $120000$ $12$ כל מחרוזות השאילתות נוצרות באקראי
$18$ $400000$ $100000$ $15$ כל מחרוזות השאילתות נוצרות באקראי
$19$ $30000$ $30000$ $7$ אין
$20$ $60000$ $60000$ $9$ אין
$21$ $90000$ $90000$ $11$ אין
$22$ $200000$ $120000$ $12$ אין
$23$ $400000$ $80000$ $15$ אין
$24$ $400000$ $100000$ $15$ אין
$25$ $400000$ $120000$ $15$ אין

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.