zoukankan      html  css  js  c++  java
  • 1077 Kuchiguse (20 分)

    1. 题目

    The Japanese language is notorious for its sentence ending particles. Personal preference of such particles can be considered as a reflection of the speaker's personality. Such a preference is called "Kuchiguse" and is often exaggerated artistically in Anime and Manga. For example, the artificial sentence ending particle "nyan~" is often used as a stereotype for characters with a cat-like personality:

    • Itai nyan~ (It hurts, nyan~)
    • Ninjin wa iyada nyan~ (I hate carrots, nyan~)

    Now given a few lines spoken by the same character, can you find her Kuchiguse?

    Input Specification:

    Each input file contains one test case. For each case, the first line is an integer N (2≤N≤100). Following are N file lines of 0~256 (inclusive) characters in length, each representing a character's spoken line. The spoken lines are case sensitive.

    Output Specification:

    For each test case, print in one line the kuchiguse of the character, i.e., the longest common suffix of all N lines. If there is no such suffix, write nai.

    Sample Input 1:

    3
    Itai nyan~
    Ninjin wa iyadanyan~
    uhhh nyan~
    

    Sample Output 1:

    nyan~
    

    Sample Input 2:

    3
    Itai!
    Ninjinnwaiyada T_T
    T_T
    

    Sample Output 2:

    nai
    

    2. 题意

    找出n个语句中的习惯语。习惯语即每句话结尾都要加上的相同语句。

    例:

    1111111hello

    22hello

    33333333333hello

    那么这三句话的习惯语为hello。即题目要求找出n句话结尾最长的习惯语,如果没有则输出nai

    3. 思路——字符串

    从每句话的末尾遍历,首先记录下第一句话倒数第k个字母,然后与其他几句话的倒数第k个字母进行比较,如果都一致,则将该字母加入结果字符串(即习惯语)。直到出现n句话的倒数第k个字母不一致的情况,查找完毕!其中注意一个细节条件,倒数第k个字母可能对于某句话来说越界了,这时候也要终止查找。

    4. 代码

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    	int n;
    	cin >> n;
    	string strs[n];
    	getchar();
    	for (int i = 0; i < n; ++i)
    		getline(cin, strs[i]);
    		
    	int k = 1;
    	string res = ""; 
    	int flag = 1;		// 终止循环条件 
    	char ch;
    	while (true)
    	{ 
    		for (int i = 0; i < n; ++i)
    		{
    			// 判断每个语句的倒数第k个字母是否相同 
    			int j = strs[i].length() - k;
    			if (j < 0)	// 越界情况,flag置为0,查找完毕 
    			{
    				flag = 0;
    				break;
    			} 
    			// 如果i等于0,表示第一个语句,将该字符记录下来,与其他语句对比 
    			else if (i == 0)
    				ch = strs[i][j];
    			// 如果对比结果不一致,说明习惯语收集完毕,退出循环 
    			else if (strs[i][j] != ch) 
    			{
    				flag = 0;
    				break;
    			}
    		}
    		if (!flag) break;
    		// 因为ch为倒数第k个字符,所以使用ch+res,这样可以按原字符串顺序输出 
    		res = ch + res;
    		k++;
    	}
    	if (res != "")
    		cout << res << endl;
    	else
    		cout << "nai" << endl;
    	return 0;
    }
     
    
  • 相关阅读:
    bzoj 3339 莫队
    E. XOR and Favorite Number
    HDU 2222 AC自动机
    SPOJ 694 不同子串个数
    Codeforces Round #428 (Div. 2)
    HDU 6103
    《贪婪的动态规划》
    《浅谈图论模型的建立与应用》
    bzoj 2194 快速傅里叶之二
    java中高级面试题整理及参考答案
  • 原文地址:https://www.cnblogs.com/vanishzeng/p/15479949.html
Copyright © 2011-2022 走看看