http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11354&courseid=0 Problem description |
The philosopher Willard Van Orman Quine (1908–2000) described a novel method of constructing a sentence in order to illustrate the contradictions that can arise from self-reference. This operation takes as input a single phrase and produces a sentence from that phrase. (The author Douglas R. Hofstadter refers to this process as to Quine a phrase.) We can define the Quine operation like so:
Quine(A) = "A" A In other words, if A is a phrase, then Quine(A) is A enclosed in quotes ("), followed by a space, followed by A. For example: Quine(HELLO WORLD) = "HELLO WORLD" HELLO WORLD Below are some other examples of sentences that can be created by the Quine operation. Note that Quining allows sentences to be indirectly self-referential, such as the last sentence below. "IS A SENTENCE FRAGMENT" IS A SENTENCE FRAGMENT"IS THE NAME OF THIS PROBLEM" IS THE NAME OF THIS PROBLEM"YIELDS FALSEHOOD WHEN QUINED" YIELDS FALSEHOOD WHEN QUINED Your goal for this problem is to take a sentence and decide whether the sentence is the result of a Quine operation. |
Input |
The input will consist of a sequence of sentences, one sentence per line, ending with a line that has the single word, END. Each sentence will contain only uppercase letters, spaces, and quotation marks. Each sentence will contain between 1 and 80 characters and will not have any leading, trailing, or consecutive spaces.
You must decide whether each sentence is the result of a Quine operation. To be a Quine, a sentence must match the following pattern exactly:
If it matches this pattern, the sentence is a Quine of the phrase A. Note that phrase A must contain the exact same sequence of characters both times it appears. |
Output |
There will be one line of output for each sentence in the data set. If the sentence is the result of a Quine operation, your output should be of the form,
If the sentence is not the result of a Quine operation, your output should be the phrase, not a quine. |
Sample Input |
"HELLO WORLD" HELLO WORLD"IS A SENTENCE FRAGMENT" IS A SENTENCE FRAGMENT"IS THE NAME OF THIS PROBLEM" IS THE NAME OF THIS PROBLEM"YIELDS FALSEHOOD WHEN QUINED" YIELDS FALSEHOOD WHEN QUINED"HELLO" I SAIDWHAT ABOUT "WHAT ABOUT"" NO EXTRA SPACES " NO EXTRA SPACES"NO"QUOTES" NO"QUOTES""END |
Sample Output |
Quine(HELLO WORLD)Quine(IS A SENTENCE FRAGMENT)Quine(IS THE NAME OF THIS PROBLEM)Quine(YIELDS FALSEHOOD WHEN QUINED)not a quinenot a quinenot a quinenot a quinenot a quine |
Judge Tips |
A review of quotation marks in strings: As a reminder, the quotation mark character is a regular character, and can be referred to in C, C++, and Java using the standard single-quote notation, like so:
'"' However, to place a quotation mark inside a double-quoted string in C, C++, and Java, you must place a backslash ( "This quotation mark \" is inside the string""\"""\"SAID SHE\" SAID SHE" |
题意:给出一个字符串,符合"A"A的状况输出Quine(A),否则输出not a quine
思路:首先从左到右找出第一对双引号里的字符串,然后从右到左找出一个双引号后面的字符串,处理好好比较即可
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char s1[10005],s2[10005]; char str[20005]; int main() { int len,i,l1,l2; while(gets(str)) { if(!strcmp(str,"END")) break; len = strlen(str); l1 = l2 = 0; if(str[0] != '"')//第一个必须为“ { printf("not a quine\n"); continue; } for(i = 1; i<len; i++)//找到第一对引号内的字符串 { if(str[i]!=34) s1[l1++] = str[i]; else { s1[l1] = '"'; break; } } for(i = len-1; i>=0; i--)//从后面开始找到第一个引号出现的位置为止 { if(str[i] == ' ' && str[i-1] == '"') { s2[l2] = '\0'; break; } else s2[l2++] = str[i]; } char tem; for(i = 0; i<l2/2; i++)//翻转字符串 { tem = s2[l2-1-i]; s2[l2-1-i] = s2[i]; s2[i] = tem; } if(!strcmp(s1,s2)) printf("Quine(%s)\n",s1); else printf("not a quine\n"); } return 0; }